【发布时间】:2013-09-29 01:47:06
【问题描述】:
看看这段代码:
#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)有关还是我在这里遗漏了一些重要的东西?
【问题讨论】:
-
你根本不会像那样测试浮点数的相等性。
-
@yngum 为什么?我该怎么办?
-
通常测试浮点值是否相等是个坏主意,因为小的舍入误差会产生意想不到的结果。但是,正如您所说,这会使用相同的输入进行两次相同的计算,因此测试应该通过。它适用于至少一个版本的 GCC:ideone.com/FPjRVN。您使用的是什么版本和平台?
-
@tuks:你的教授可能什么都没说,但另一位教授说了很多:cl.cam.ac.uk/teaching/1011/FPComp/floatingmath.pdf
-
@AdamBurry 是的,我明白了...因为 (4/3),应该是 (4.0/3)
标签: c++ comparison double