Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么C++给我不同的答案,看起来像是相同的计算?_C++_Floating Point - Fatal编程技术网

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

为什么C++给我不同的答案,看起来像是相同的计算?,c++,floating-point,C++,Floating Point,我在一个简单的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运行上面的公

我在一个简单的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,所以我不明白为什么会发生这种情况?

简单回答:浮点值不精确

答案很长:

in x=atof不可能是正确的

double atof ( const char * str )

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

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


考虑到这一点,10进制计算的精度随着所涉及绝对值的大小的增加而降低并不奇怪。

当你减去两个几乎相同的数字y和x,得到一个比这两个数字都小的数量级,你总是会损失很多精度,除了在不太可能的情况下,y和x的二进制扩展不晚于第53位终止。这并不奇怪

在这种特殊情况下,只需计算即可轻松发现问题,而无需使用技巧

75.22 - 75.21


结果将分别为0.010000000000051和0.009999999979。

并非所有数字都可以在浮点双精度数字中精确定义。浮点类型不精确。接受它。上面的代码一定不是你真正的代码。。。例如,声明main时没有参数void。此外,为什么要使用atof然后分配给int?@KerrekSB:他显然不知道这一点——我不确定为什么必须使用它。这是一个诚实的问题,不是什么挑战。@slavik262:这不是一个贬低,而是一个诚实的建议:接受它,继续做更有趣的事情;这不值得大惊小怪。
7.22 - 7.21