为什么c ++给出了不同的答案,看起来像是相同的计算?

时间:2013-01-18 21:56:12

标签: c++ floating-point

我在简单的主要内容中有以下源代码:

int main(int argc, char** argv)
{
    double x = atof(argv[1]);
    double y = atof(argv[2]);

    double res = x + std::floor((y - x) * .5 * 100 + .5)*0.01;

    std::cout << res << std::endl;
}

如果我用75.21 75.22运行上面它给了我75.22但是如果我用7.21和7.22运行它它给了我7.21。这两个数字相差0.01,所以我不明白为什么会发生这种情况?

4 个答案:

答案 0 :(得分:5)

简短回答:浮点值不精确。

答案很长:What Every Computer Scientist Should Know About Floating-Point Arithmetic

答案 1 :(得分:3)

在浮点运算的许多复杂问题中,浮点数在其最小值和最大值之间沿实线不均匀分布。接近0浮点数(被认为是实数行上的点)的密度远远大于0,密度随着距离0的(绝对)距离的增加而减小。

对于通常的IEEE标准表示,在1(基数-10)和2(基数-10)之间存在尽可能多的数字,因为存在2(基数-10)和4(基数-10)之间。对于任何(正或负)整数[2^i,2^i+1],区间i中的浮点数相同,使得区间的两个端点都可以表示。

考虑到这一点,随着所涉及的绝对值的大小增加,基数10计算的精度降低也就不足为奇了。

答案 2 :(得分:0)

in x = atof ()不能正确

double atof ( const char * str )

答案 3 :(得分:0)

当你减去两个几乎相同的数字yx时,为了得到比两者都小的数量级,你总是失去很多精度(除了不太可能的情况是yx的二进制扩展不迟于第53位终止。这并不奇怪。

在这种特殊情况下,只需计算

即可轻松查看“问题”
75.22 - 75.21

7.22 - 7.21

(结果分别为0.01000000000000510.00999999999999979