知識社群登入
如何證明 double 浮點數的精確度的有效位數
by 高顯忠, 2010-12-07 16:33, 人氣(3160)
請參考下面的 程式設計,

double 是八個 Bytes 的變數型態,
有 64個 bits, 第一個 bits 用來表示 浮點數的正負。

使用 11個 bits 來表示 浮點數的 數量級。
可以用來表示 (2^-1024) 到 (2^+1023) 範圍的 浮點數,

大概是 十進位數字的
(10^-308) 到 (10^308)

剩下的 52個 bits 是用來表示 浮點數的 內容。
所以,精確度可以到達 相對誤差:

(1.0)/(2^52), 也就是 十進位的
大概 16 - 17位的 有效位數。

#if 0

 b= 4.14159265358979310000,
 a= 3.14159265358979310000
 Press [Esc] for stop! other key for continue...

 b= 9007199771293056.000,
 a= 9007199771293056.000
 Press [Esc] for stop! other key for continue...

#endif
// ----------------------------------------------

#include "inc-01.h"
#include "sj-01.h"
#include "sj-02.h"
// ----------------------------------------------

int main()
{
double a, b;

a= 4.0*atan(1.0);
b= a + 1;// (a + 1) > a, so b > a
printf("\n b= %.20lf, \n a= %.20lf\n", b, a);
pause();

while (b > a) {
a= a*(1.0 + 1e-7);
b= a + 1.0;
}

// !(b > a), --> b <= a
printf("\n b= %.3lf, \n a= %.3lf\n", b, a);
pause();

return 0;
}// end of main()