2014-10-26 85 views
0

我想知道是否存在最負的32位浮點值(IEEE標準754)的精確值?最負32浮點數的確切值是多少?

我在兩個浮點TIFF文件看到兩個像素值顯然是針對最負32位float

-3.4028230607370965E38 
-3.4028234663852886E38 

哪個是正確的? (或者是價值語言/特定平臺。)

我搜索了Google,並在大部分時間獲得-3.4E38,這是近似值。

感謝,

回答

6

這個回答假設float格式實際上是IEEE 754 binary32,它如果它是在一個文件格式的情況下使用,如TIFF肯定是。如果架構內部使用非IEEE 754浮點數,則此架構有責任在TIFF圖像中處理IEEE 754 binary32數字。

最負的浮點數的確切值是,in hexadecimal,-0x1.fffffep127。由於需要大量數字,因此寫入十進制數字會稍微令人不愉快,因此人們通常會編寫幾個十進制近似值中的一個,當轉換爲float時,會生成該數字。您的問題中的兩個值都不是-0x1.fffffep127的確切值。

請注意,「-3.4E38」不是近似值,當轉換爲浮點數時,會產生最負的浮點數。這只是一個粗糙的場地。

最負浮動,用十進制時的精確值,是:

-3.4028234663852885981170418348451692544e + 38

在你的問題的第一個值,作爲最負float的候選人是非常奇怪,因爲誰寫它不屑於寫是錯誤的,而且確實數字,而不是四捨五入到最負浮動:

#include <stdio.h> 
#include <float.h> 
#include <math.h> 

int main() { 
    printf("%.38e\n", -FLT_MAX); 
    printf("%.38e\n", -0x1.fffffep127); 
    printf("%.38e\n",-3.4028230607370965E38f); 
    printf("%.38e\n\n",-3.4028234663852886E38f); 
    printf("%a\n",-3.4028230607370965E38f); 
} 

生產:

 
-3.40282346638528859811704183484516925440e+38 
-3.40282346638528859811704183484516925440e+38 
-3.40282306073709652508363335590014353408e+38 
-3.40282346638528859811704183484516925440e+38 

-0x1.fffffap+127 

上述程序需要printf函數,當將double轉換爲十進制時,將正確輸出所有數字。如果這不是你所擁有的,程序可能會產生不同的結果,但是仍然應該顯示浮點數比你問題中的第一個浮點數更負。

它顯示您的問題中的第二個值是最負的浮點數的十進制近似值(用f後綴解析時,它的四捨五入爲相同的值),而第一個值是來自最負浮點數的2 ULPs( -0x1.fffffcp + 127是來自最負的浮點數的一個ULP,而-0x1.fffffap + 127是兩個遠離的ULP。單精度格式中只有23個顯式有效位,23不是4的倍數,因此未使用6位十六進制符號的最後一位)。