gpt4 book ai didi

c++ - 在 C++ 中从 String 转换为 Double 的奇怪之处

转载 作者:太空狗 更新时间:2023-10-29 20:25:30 26 4
gpt4 key购买 nike

我必须从文本文件中读取一些数据( double )。有时,当使用 atofstring 转换为 double 时,我会得到奇怪的结果。以下是演示问题的代码片段——请注意,我使用的是 GNU C++ 4.8.1 编译器。代码简单地打印出 -0.1 和 0 之间的数字,步长为 0.01;所以只有 9 个数字是预期的。

    #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 |

请注意,基于字符串赋值(a_string)的for循环比基于内联赋值(a_inline)的循环多运行一次>) -- 注意最后一个数字 -3.46945e-18。阅读了有关字符串到 double 转换的其他相关帖子后,我仍然无法弄清楚为什么会发生这种情况。

最佳答案

二进制 float 通常不是小数的精确表示。直接比较不同的计算结果或计算结果与文字的直接比较必然会不直观地失败。比较时必须使用间隔。这个问题与 atof 本身没有什么关系。

关于c++ - 在 C++ 中从 String 转换为 Double 的奇怪之处,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23779216/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com