我必須從文本文件中讀取一些數據(精度爲double
)。有時,當從string
轉換爲double
與atof
時,我會得到奇怪的結果。以下是演示該問題的代碼片段 - 請注意,我使用的是GNU C++ 4.8.1編譯器。代碼簡單地打印出-0.1和0之間的數字,步長爲0.01;所以只有,預計9個數字。在C++中將字符串轉換爲雙精度的奇異性
#include <iostream>
#include <cstdlib>
int main() {
int y;
double a, b = 0.0, x = 1e-2, z;
double a_string = atof("-0.1");
double a_inline = -0.1;
std::cout << "Inline:: ";
a = a_inline;
for (y = 1 ; (z = a + y * x) < b; ++y){
std::cout << y << ": " << z << " | ";
}
std::cout << "\nString:: ";
a = a_string;
for (y = 1 ; (z = a + y * x) < b; ++y){
std::cout << y << ": " << z << " | ";
}
return 0;
}
結果是
Inline:: 1: -0.09 | 2: -0.08 | 3: -0.07 | 4: -0.06 | 5: -0.05 | 6: -0.04 | 7: -0.03 | 8: -0.02 | 9: -0.01 |
String:: 1: -0.09 | 2: -0.08 | 3: -0.07 | 4: -0.06 | 5: -0.05 | 6: -0.04 | 7: -0.03 | 8: -0.02 | 9: -0.01 | 10: -3.46945e-18 |
注意,基於字符串賦值for
環(a_string
)運行一次比基於內嵌分配(a_inline
)環路更多 - 注意最後號碼-3.46945e-18
。閱讀了其他相關的帖子後,我仍然無法弄清楚爲什麼會發生這種情況。
注意:它在我的鑽機上表現得如預期(每個循環9個值)。 (Apple LLVM版本5.1(clang-503.0.40)(基於LLVM 3.4svn)),編譯爲x64。有趣的是,不同的結果來自[** Coliru **](http://coliru.stacked-crooked.com/a/c918637b84884a8d)與[** ideone.com **](https://ideone.com/ LO4yrb)。 – WhozCraig
它也適用於我,GNU C++ 4.3.2,x64 – blackmesa
在我看來,atof(「 - 0.1」)必須作爲字符串解析器工作,所以它不能像從-0.1獲得-0.1值一樣工作「字符串,它通過將某些值相加並將其乘以-1.0(在您的情況下爲-1.0 * 0.1)來獲得最終值。我認爲這種增加是原因。在它之後,你的字符串值將會像-0.100000000000001一樣。 –