簡體   English   中英

大浮點數的計算精度不如小浮點數

[英]are computations with large floats less accurate then with small floats

這句話正確嗎?

由於浮點數在計算機上的對數分布,因此使用大數進行的計算不太准確。

因此,這意味着以大約1的值進行計算(由於舍入誤差)比例如以1e20縮放每個數字的相同計算更准確?

簡短答案:

是的,該說法是正確的,較大的浮點數不如較小的浮點數精確。

細節:

浮點數具有分配給尾數的固定位數 如果要表示的數字比尾數需要更多的位,則將四舍五入。 因此,可以更精確地表示較小的數字。

為了更加具體,我編寫了以下程序,該程序將較小的值逐漸添加到較大的浮點數和較小的浮點數上。 同樣為了顯示差異,我添加了一個沒有舍入的雙精度浮點。 但是,如果尾數更大,則雙精度型也會遇到相同的問題。

#include <stdio.h>

int main() {
  float large_float, small_float, epsilon;
  double large_double, small_double;

  large_float = 1 << 20;
  small_float = 1;
  epsilon = 0.1;

  large_double = large_float;
  small_double = small_float;

  printf("large_float\t large_double\t small_float\t small_double\t epsilon\n");

  for(int i = 0; i < 10; i++) {
    printf("%f\t %f\t %f\t %f\t %f\n", large_float, large_double,small_float, small_double, epsilon);
    large_float += epsilon;
    large_double += epsilon;
    small_float += epsilon;
    small_double += epsilon;
    epsilon /= 2;        
  }

  return 0;
}

運行此程序將產生以下輸出:

large_float      large_double    small_float     small_double    epsilon
1048576.000000   1048576.000000  1.000000        1.000000        0.100000
1048576.125000   1048576.100000  1.100000        1.100000        0.050000
1048576.125000   1048576.150000  1.150000        1.150000        0.025000
1048576.125000   1048576.175000  1.175000        1.175000        0.012500
1048576.125000   1048576.187500  1.187500        1.187500        0.006250
1048576.125000   1048576.193750  1.193750        1.193750        0.003125
1048576.125000   1048576.196875  1.196875        1.196875        0.001563
1048576.125000   1048576.198438  1.198437        1.198438        0.000781
1048576.125000   1048576.199219  1.199219        1.199219        0.000391
1048576.125000   1048576.199609  1.199609        1.199609        0.000195

如您所見, large_float值的精度低於small_float ,這也可能導致最終結果也不太准確。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM