在我的程序中,我计算了两个值(双精度)x
和y
,然后找到数字1/(x^2 + y^2)
。当x
或y
如此接近于零而得分为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;
}
答案 0 :(得分:1)
如果你想将double值与零进行比较,你应该这样做:
bool IsZero(double dest)
{
if(dest > -0.0000001 && dest < 0.0000001)
return true;
else
return false;
}
答案 1 :(得分: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。
答案 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