-1

在我的程序中,我计算两个值(双精度)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;
}
4

3 回答 3

1

如果你想将一个双精度值与零进行比较,你应该这样做:

bool IsZero(double dest)
{
if(dest > -0.0000001 && dest < 0.0000001)
return true;
else
return false;
}
于 2013-07-13T10:03:53.540 回答
0

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

使用 IEEE 浮点,小浮点值的平方总是可以表示的,可以表示为较小的非零值或 0。无论如何,不​​要被分母中的计算分心。潜在的问题是,在某些时候1/d,即使d不是 0,也会变得太大而无法表示为双精度,并且您会得到无限的结果。如果要将无穷大变成零,最简单的方法是检查无穷大并将其替换为 0:

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

这假定 C99 或 C++11。

于 2013-07-13T13:30:20.343 回答
-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
于 2013-07-13T10:49:11.650 回答