gpt4 book ai didi

两个 double 值的c++比较无法正常工作

转载 作者:IT老高 更新时间:2023-10-28 22:34:20 25 4
gpt4 key购买 nike

看看这段代码:

#include <cmath>
#include <iostream>
using namespace std;
class Sphere
{
double r;
public:
double V() const { return (4/3) * 3.14 * pow(r,3); }
bool equal(const Sphere& s) const
{
cout << V() << " == " << s.V() << " : " << ( V() == s.V() );
return ( V() == s.V() );

}

explicit Sphere(double rr = 1): r(rr){}

};
main()
{
Sphere s(3);
s.equal(s);
}

输出是 84.78 == 84.78 : 0 这意味着相同的方法不会每次都返回相同的值,即使所有参数都是静态的?

但是如果我在 V() 方法定义中写 3.0 而不是 3.14 ,像这样:

double V() const { return (4/3) * 3.0 * pow(r,3); }

然后,输出为:84.78 == 84.78 : 1

这里发生了什么?对于我的程序,我需要这种方法,它将比较两个对象的体积,但这是不可能的?我敲了很长时间才弄清楚问题的原因,幸运的是我找到了,但现在我不明白为什么?它与编译器(GCC)有关还是我在这里遗漏了一些重要的东西?

最佳答案

使用 == 运算符比较浮点值很容易出错; 应该相等的两个值可能不是由于算术舍入错误。比较这些的常用方法是使用 epsilon:

bool double_equals(double a, double b, double epsilon = 0.001)
{
return std::abs(a - b) < epsilon;
}

关于两个 double 值的c++比较无法正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18971533/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com