簡體   English   中英

浮點最大值

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

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