Board logo

標題: (a + 1) 恆 大於 a ??? [打印本頁]

作者: sjgau    時間: 2013-10-24 20:32     標題: (a + 1) 恆 大於 a ???

在 數學上

(a + 1) 恆 大於 a ,
但是,任何 電腦語言,包刮 VBA

以下的 程式設計片段

double a, b, c;

a= 1.23;
b= a + 1;

while (b > a) do begin
   a= a*1.001;
   b= a + 1;

end;
// b <= a, ???
print a, b

// why????
作者: sunnyso    時間: 2013-10-24 22:19

回復 1# sjgau


    :o  想知道爲什麼. 請解說.
作者: sunnyso    時間: 2013-10-25 10:35

回復 2# sunnyso

請賜教. 為什麼呢? 很想知道.
作者: sjgau    時間: 2013-10-25 11:02

  1. Sub test1052()
  2.    Dim a As Single, b As Single
  3.    a = 1.23
  4.    b = a + 1
  5.    ' b > a
  6.    
  7.    While (b > a)
  8.       a = a * 1.001
  9.       b = a + 1
  10.       
  11.    Wend
  12.    ' b < a, why???
  13.    
  14.    Cells(3, 1) = a
  15.    Cells(4, 1) = b
  16.    ' a= b= 16781740, why???
  17.    

  18.    MsgBox ("Done!")
  19.    
  20.    
  21.    

  22. End Sub
複製代碼

作者: sjgau    時間: 2013-10-25 11:04

回復 3# sunnyso

因為,single 的福點數是 四個byte, 32個bits,
使用 23個 bits 表示 數字的精確度,

2^23 --> no
把 0.5 到 1.0 切割成為 no 等分,
所以,精確度就是 1/no
作者: sjgau    時間: 2013-10-25 11:07

Sub test1052()
   Dim a As Double, b As Double
   a = 1.23
   b = a + 1
   ' b > a
   
   While (b > a)
      a = a * 1.001
      b = a + 1
   Wend
   ' b < a, why???
   
   Cells(3, 1) = a
   Cells(4, 1) = b
   ' a= b= 9.01577E+15, why???
   

   MsgBox ("Done!")
End Sub
作者: sjgau    時間: 2013-10-25 11:09

如果是 ,double 的福點數是 八個byte, 64個bits,
使用 52個 bits 表示 數字的精確度,

2^53 --> no
把 0.5 到 1.0 切割成為 no 等分,
所以,精確度就是 1/no
作者: stillfish00    時間: 2013-10-25 11:15

回復 3# sunnyso
你可以先想想 Single 只有32位元為何最大可表示到 3.402823E38。
可參考 IEEE 754  http://zh.wikipedia.org/wiki/IEEE_754
作者: sunnyso    時間: 2013-10-25 13:48

感謝三位大大熱心解說. 很受教
作者: sjgau    時間: 2013-10-30 17:38

回復 9# sunnyso


    也可以過去 本討論區
C語言程式設計板板 看看
作者: sunnyso    時間: 2013-10-30 23:29

回復 10# sjgau

感謝指引




歡迎光臨 麻辣家族討論版版 (http://forum.twbts.com/)