0

我在一个简单的 main 中有以下源代码:

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

4 回答 4

5

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

长答案:每个计算机科学家都应该知道的关于浮点运算的知识

于 2013-01-18T22:08:42.260 回答
3

浮点运算的许多错综复杂之处在于,浮点数并不是沿着它们的最小值和最大值之间的实线均匀分布的。接近0浮点数,被认为是实数线上的点,比远离 更密集0,并且密度随着(绝对)距离的0增加而减小。

对于通常的 IEEE 标准表示,例如 1(base-10) 和 2(base-10) 之间的数字与 2(base-10) 和 4(base-10) 之间的数字一样多。[2^i,2^i+1]对于任何(正或负)整数,区间中有相同数量的浮点数,因此区间的i两个端点都是可表示的。

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

于 2013-01-18T22:12:17.023 回答
0

in x = atof ()不可能是对的

double atof ( const char * str )
于 2013-01-18T22:10:35.850 回答
0

When you subtract two almost identical numbers y and x, to get a number orders of magnitude smaller than both, you always lose a lot of precision (except in the unlikely case that the binary expansions of both y and x terminates no later than at the 53rd bit). That's not surprising.

In this particular case, you can see the "issue" easily without tricks by just calculating

75.22 - 75.21

and

7.22 - 7.21

(the results will be 0.0100000000000051 and 0.00999999999999979, respectively).

于 2013-01-19T18:56:30.403 回答