This question already has answers here:
Is floating point math broken?

(30个答案)


4年前关闭。




我想计算三个双数之和,我希望得到1。
double a=0.0132;
double b=0.9581;
double c=0.0287;
cout << "sum= "<< a+b+c <<endl;
if (a+b+c != 1)
cout << "error" << endl;

总和等于1,但我仍然会出错!我也尝试过:
cout<< a+b+c-1

它给我-1.11022e-16

我可以通过将代码更改为来解决问题
if (a+b+c-1 > 0.00001) cout << "error" << endl;
并且有效(没有错误)。负数如何大于正数?为什么数字不等于1?
求和和下溢/上溢也许是基本的东西,但是我非常感谢您的帮助。
谢谢

最佳答案

有理数是无限精确的。电脑是有限的。
精度损失是计算机编程中众所周知的问题。
真正的问题是,您该如何补救?

比较浮点数是否相等时,请考虑使用近似函数。

#include <iostream>
#include <cmath>
#include <limits>
using namespace std;

template <typename T>
bool ApproximatelyEqual(const T dX, const T dY)
{
    return std::abs(dX - dY) <= std::max(std::abs(dX), std::abs(dY))
    * std::numeric_limits<T>::epsilon();
}

int main() {
    double a=0.0132;
    double b=0.9581;
    double c=0.0287;

    //Evaluates to true and does not print error.
    if (!ApproximatelyEqual(a+b+c,1.0)) cout << "error" << endl;
}

08-26 01:03