[英]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.