我在简单的主要内容中有以下源代码:
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,所以我不明白为什么会发生这种情况?
答案 0 :(得分:5)
答案 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)
当你减去两个几乎相同的数字y
和x
时,为了得到比两者都小的数量级,你总是失去很多精度(除了不太可能的情况是y
和x
的二进制扩展不迟于第53位终止。这并不奇怪。
在这种特殊情况下,只需计算
即可轻松查看“问题”75.22 - 75.21
和
7.22 - 7.21
(结果分别为0.0100000000000051
和0.00999999999999979
。