[英]maximum value in float
對於以下循環,我期望輸出為sum = 20e6
但輸出為sum = 1.67772e+07
。
float sum=0.0f;
for(i=0;i<20e6;i++)
sum = sum + 1.0f;
printf("sum = %g\n", sum);
問題1:為什么sum
為浮點數不能包含大於1.67772e07
值?
問題2:如果我將循環中的語句更改為sum = sum + 1.001f;
那么sum的最終值為2.32229e+07
。 為什么總和值有這種差異?
問題3:我們可以在上面的循環中控制此行為,以便可以將float用於大於1.67772e07
值,同時仍以1.0f遞增嗎?
在某個時候,最接近x + 1.0f
可表示值是x
本身。 達到該點之后,由於此舍入錯誤,您的循環將不會導致sum
任何進一步增加。
作為說明,您可以使用科學計數法使用固定數量的有效數字來觀察這種效果。 例如,有4個有效數字:
0 = 0.000e0
1 = 1.000e0
2 = 2.000e0
3 = 3.000e0
...
9 = 9.000e0
10 = 1.000e1
11 = 1.100e1
...
99 = 9.900e1
100 = 1.000e2
101 = 1.010e2
...
999 = 9.990e2
1000 = 1.000e3
1001 = 1.001e3
...
9999 = 9.999e3
10000 = 1.000e4
如果再加上一個,應該得到1.0001e4
,但是由於只保留了4個有效數字,因此存儲的值是1.000e4
,例如在該系統中為10000 + 1 = 10000,並且繼續遞增只會永遠重復此計算而無需更改結果。
您的代碼工作方式完全相同,除了float
使用二進制浮點,而不是科學計數法使用小數。 但是有效的二進制數字的數量仍然是有限的,並且再加上一個不改變這些有效數字之一時, sum
停止增加。
它有點復雜,因為使用二進制時,“正確”的結果介於兩個可表示的數字之間,因此舍入可以向下或向上進行 ,在這種情況下,您要求加1,但實際上得到的結果高2。 在任何情況下,一旦可表示的值之間的距離變為4,則嘗試將其相加將無效。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.