c - 如何在 C 中处理(设置条件并比较)有符号 float ?

标签 c floating-point

我正在尝试比较 2 个浮点变量。

但由于符号不同,比较失败:

int main()
{
    //---------------------------------
    float d = 0.1;
    float f1, f2;
    printf("data: %.1f\n", d);
    //---------------------------------
    d -= 0.1; // 0.0
    f1 = d;
    printf("data: %.1f\n", d);
    printf("f1: %.1f\n", f1);
    //---------------------------------
    d -= 0.1; // -0.1
    printf("data: %.1f\n", d);
    //--------------------------------
    d += 0.1; // -0.0
    f2 = d;
    printf("data: %.1f\n", d);
    printf("f2: %.1f\n", f2);
    //---------------------------------

    if (f1 == f2)
    {
        printf("f1 and f2 equals\n");  // should get here
    }
    else
    {
        printf("f1 and f2 NOT equals\n");
    }

    if (f2 != -0.0)
    {
        printf("f2 NOT equal -0.0 \n"); // should get here
    }
    else
    {
        printf("f2 equals -0.0 \n"); 
    }
}

输出: output

  • 数据:0.1
  • 数据:0.0
  • f1:0.0
  • 数据:-0.1
  • 数据:-0.0
  • f2:-0.0
  • f1 和 f2 不等于
  • f2 不等于 -0.0

如何正确设置条件来比较 -0.0 和 0.0 值?

最佳答案

这实际上是精度的限制,让你在这里感到困难,每一次计算都是以有限的精度进行的

long explanation at Wikipedia

要克服这个问题,您需要允许一定的范围:

if (f1 == f2)

可能会变成

if( ((f1 - f2) < 0.001) &&  ((f1 - f2) > -0.001) )

当你可以容忍给定的范围0.001时,否则根据你的需要选择。 与

相同
if (f2 != -0.0)

您也应该在此处指定一个范围,因为在某些计算中您只是偶尔会达到给定的常量值。希望这会有所帮助。

关于c - 如何在 C 中处理(设置条件并比较)有符号 float ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54944405/

相关文章:

c++ - cmath 和 math.h 给出不同的答案

c - Cuda 中的算法

c++ - 确定 c/c++ 代码中内存泄漏的工具

c - 帮助使此代码针对 SPOJ 运行得更快

c++ - OpenCV - 关闭图像显示窗口

c - C是否必须用科学计数法计算出一个数字?

在 C99+ 中结合指定的初始值设定项和 malloc?

java - 使用 String.format 将浮点值格式化为字符串时出现奇怪的结果

python - 为什么 “np.inf//2” 导致 NaN 而不是无穷大?

java - 针对 SSE2 之前的处理器的 Java 运行时如何实现浮点基本操作?