检查double实际上是否为零

时间:2013-07-13 09:43:45

标签: c++ double precision

在我的程序中,我计算了两个值(双精度)xy,然后找到数字1/(x^2 + y^2)。当xy如此接近于零而得分为NaN时,我的问题就出现了。实际上,当两个变量接近零时,分数应该为零。我尝试使用比较x==0 || y==0,但这不起作用,因为它们是双打的。

是否有一种计算有效的方法来考虑这一点?

#include <iostream>

using namespace std;

val(double x, double y)
{
    return 1/(x*x + y*y);
}

int main()
{
    //determine x and y....
    val(x, y)
    return 0;
}

3 个答案:

答案 0 :(得分:1)

如果你想将double值与零进行比较,你应该这样做:

bool IsZero(double dest)
{
if(dest > -0.0000001 && dest < 0.0000001)
return true;
else
return false;
}

答案 1 :(得分:0)

我不知道你为什么得到NaN,除非xy已经是NaN,或者你所做的计算不是你所展示的那个,或者你'重新使用一些非IEEE浮点实现。

对于IEEE浮点,一个小的浮点值平方总是可以表示,或者作为较小的非零值或者为0.在任何情况下,不要被分母中的计算分心。根本问题是,在某些时候,1/d,即使d不为0,也会变得太大而无法表示为双倍而且会得到无限结果。如果你想将无穷大变成零,最简单的方法是检查无穷大并用0替换它:

#include <math.h>
double res = // whatever
if (isinf(res))
    res = 0;

这假定为C99或C ++ 11。

答案 2 :(得分:-1)

#include <float.h>

// could also be your custom consant
// see also http://stackoverflow.com/a/77735/213682
// also this http://stackoverflow.com/a/2729750/213682
const double my_epsilon = DBL_MIN;

double val(double x, double y)
{
    double denom = x*x + y*y;
    if (denom < my_epsilon) {
        return 0.0; // or some other value indicating an error
    }
    return 1.0 / denom;
}

在我的机器上,1.0 / DBL_MIN提供了一个强大的数字:

44942328371557897693232629769725618340449424473
55766431835752028943316895137524078317711933060
18840052800284699678483394146974422036041556232
11857659868531094441973356216371319075554900311
52352986327073802125144220953767058561572036847
82776352068092908376276711465745599868114846199
29076208839082406056034304.000000