#include "stdio.h"
#define __USE_MINGW_ANSI_STDIO 1
int main(void){
float h = 0.5;//單精度浮點數宣告
printf("%f\n",h);//%f 代表float
double i = 0.5;//雙精度浮點數宣告
printf("%lf\n",i);//%lf 代表double
long double j = 1.5;//長雙精度浮點數宣告
printf("%Lf\n",j);//%Lf 代表long double
}
--------------------------------結果---------------------------------
0.500000
0.500000
1.500000
浮點數(floating point) = 號(sign)*尾數(mantissa)*2^指數(exponent)
floating point = S * M *2 ^ E
其中 號(sign)為±1,而 2^指數(exponent)代表2的e次方。
1、將7.25化為二進位
111.01
2、確認整個小數是為正數還是負數,倘若是正數則 號(sign)為0,反之負數則為1。
S:0
3、將小數點移到能讓整個小數最高位是個位數的位置
1.1101
4、找到由左而右的第一個1,只取後面的數字。
1101
捨去第一個1的原因在於,假設有一個10進位的數字是0100,我們會很自然地把前面的
0刪掉只留下100,因為那個0是無意義的。化做二進位來說,捨去掉無意義的0之後,無論
如何最前方就一定是1了,因此不必特意儲存也會知道。
5、將這串數字,後面補上數個0,直到共有23位,而這就是尾數(mantissa)。
M:1101 0000 0000 0000 0000 000
6、計算剛剛第2點中小數點移了幾位,往左+1,往右-1,這則是指數(exponent)。
111.01 → 1.1101 小數點共往左移動了兩格所以是2。
但還沒結束喔,還要再加上指數偏移數也就是127。
2 + 127 = 129,化做二進位表示為
E:1000 0001
7、最終整個儲存形式為:
0 1000 0001 1101 0000 0000 0000 0000 000
S E M
8、計算方式
S = +1
E = 129 - 127 =2
M = 0.1101(二進位) + 1(被捨去的) = 0.5 + 0.25 + 0.0625 + 1
= 0.8125 + 1 = 1.8125
floating point = S * M * 2 ^ e
floating point = +1 * 1.8125 * 2 ^ 2
= 1.8125 * 4 = 7.25
如二進位0.0........01,假設小數點後方的0有125個。稍微計算過後我們可以知道儲存
形式為:
0 0000 0001 0000 0000 0000 0000 0000 000
S E M
計算方式:
S = + 1
E = -126
M = 1
#include "stdio.h"
int main(void){
float a = 0.3;
printf("%f",a*3000000000000000);//你以為輸出的是900000000000000嗎?
}
--------------------------------結果---------------------------------
900000062111744.000000
#include "stdio.h"
#include "sys/time.h"
int main(void){
struct timeval begin, end;
gettimeofday(&begin, 0);
float a = 0.3;
for(int i =0;i<100000000;i++){
a++;
a++;
a--;
a--;
}
gettimeofday(&end, 0);
long seconds = end.tv_sec - begin.tv_sec;
long microseconds = end.tv_usec - begin.tv_usec;
double elapsed = seconds + microseconds*1e-6;
printf("Time measured: %.3f seconds.\n", elapsed);
return 0;
}
--------------------------------結果---------------------------------
Time measured: 1.139 seconds.
-------------------------------分隔線--------------------------------
#include "stdio.h"
#include "sys/time.h"
int main(void){
struct timeval begin, end;
gettimeofday(&begin, 0);
int a = 3;
for(int i =0;i<100000000;i++){
a++;
a++;
a--;
a--;
}
gettimeofday(&end, 0);
long seconds = end.tv_sec - begin.tv_sec;
long microseconds = end.tv_usec - begin.tv_usec;
double elapsed = seconds + microseconds*1e-6;
printf("Time measured: %.3f seconds.\n", elapsed);
return 0;
}
--------------------------------結果---------------------------------
Time measured: 0.730 seconds.
(這邊採用CR Ferreira的計算時間方式)