This question already has answers here:
Is floating point math broken?
(30个答案)
4年前关闭。
我想计算三个双数之和,我希望得到1。
总和等于1,但我仍然会出错!我也尝试过:
它给我-1.11022e-16
我可以通过将代码更改为来解决问题
并且有效(没有错误)。负数如何大于正数?为什么数字不等于1?
求和和下溢/上溢也许是基本的东西,但是我非常感谢您的帮助。
谢谢
(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