2010-11-01 58 views
1

我想使用strtod函數在C++(Visual C++ 2010)中將字符串轉換爲double時檢測到下溢。下面的代碼,雖然我根據strtod的文檔做了不,因爲我希望工作:strtod和下溢

char numStr[] = "123456.122111111123123123123132123123123123123124434345345"; 
char* pEnd; 
double d = strtod(numStr, &pEnd); 
int errorNum = errno; 
if (errorNum == ERANGE) // this should be true 
{ 
    // underflow occurred 
} 

使用調試器,我發現errorNum總是被設置爲0ERANGE34

我錯過了什麼?

回答

1

我認爲你會把「精確度損失」和「下溢」混淆起來。你會像1.0e-1000那樣輸入下溢。 strtod不會直接報告精度損失,但您可以嘗試更改最後一位數字並重新進行分析等。

5

該值不下溢。這是(最)大於最小正常正雙。即使是最後一個地方(5 * 10^-51)也是如此。最小正常64位IEEE雙精度爲2^-1022。

0

你的代碼沒有下溢。下溢的情況就像0.000(1000零)001轉換爲0.你說的是不精確的,測試它很困難。即使轉換回字符串snprintf並且進行字符串比較也不一定有效,因爲不需要snprintf來產生精確的結果,僅足以用strtod重建值。你試圖做的是一個難題。