0

我有一个简单的代码来比较 2 个浮点数:

我尝试使用 fabs,但它给出了错误的奇怪结果。错误是什么,正确的形式是什么?

#include <stdio.h>
#include <stdlib.h>
#include <float.h>

void compareFloat(double a1, double a2)
{
   if(fabs(a1 - a2) < DBL_EPSILON)
       printf("a1 is smaller\n");
   else
       printf("a1 is larger\n");
}

int main()
{
 float a1=0.0000004f, a2=0.0005f;
 compareFloat(a1, a2);
}

这段代码有什么错误?a1 is smaller即使我设置 a1=0.004f 和 a2=0.0005f它也总是打印

4

3 回答 3

4

abs 的原型是一个整数!

int abs (int number);

你想要浮点晶圆厂

double fabs (double number);
于 2013-05-31T12:54:17.267 回答
3

那在数学上是错误的。您实际上是在尝试比较两个浮点数是否相等,而不是更大/更小。

要比较哪个更大,只需使用operator<,例如:

if( abs(a1 - a2) > DBL_EPSILON && a1 < a2 )
// ....

假设:a1 == 1.a2 == 5.。然后fabs( a1 - a2 )将大于DBL_EPSILON,但这并不意味着a1 > a2


并且已经提到了另一个错误-abs对于integers,您需要fabs.



编辑:我会创建一个额外的函数来比较浮点数,例如:

bool areEqual( double x, double y )
{
     return ( fabs( x - y ) < DBL_EPSILON );
}

然后直接使用它 - 将使您的代码更具可读性。示例用法:

if( areEqual( a1, a2 ) )
    // equal
else if( a1 < a2 )  // here, it's guaranteed, that a1 != a2, so it's safe now
    // a1 is smaller
else
    // a2 is smaller
于 2013-05-31T13:01:11.650 回答
3

fabs(a1 - a2) < DBL_EPSILON从浮点数(FP)中取出“浮点数”。

FP 数呈对数分布。fabs(a1 - a2) < DBL_EPSILON对于较大的不同数字,即使a1,a2是相邻的 FP 值,也将始终为假。 fabs(a1 - a2) < DBL_EPSILON对于小的 FP 数总是如此,即使它们相差许多值也是如此。

相反,缩放epsilon

将 2 个数字比较为 5 个结果

void compareFloat(double a1, double a2) {
  if(a1 == a2) // Typically not performed is applications, but here for illustration.
   printf("a1 is exactly equal to a2\n");
  else if(fabs(a1 - a2) <= (DBL_EPSILON *fabs(a1)) )
   printf("a1 is nearly equal to a2\n");
  else if(a1 < a2)
   printf("a1 is smaller than a2\n");
  else if(a1 > a2)
    printf("a1 is larger than a2\n");
  else 
    printf("a1 is not comparable to a2, at least one of them is a Not-a-Number\n");
}

正如其他人所说,请务必使用fabs()而不是abs().

于 2013-05-31T13:07:12.873 回答