为什么C++给我不同的答案,看起来像是相同的计算?
我在一个简单的main中有以下源代码:为什么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运行上面的公
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