如何在c中测试浮点值?

Posted

技术标签:

【中文标题】如何在c中测试浮点值?【英文标题】:How to test float value in c? 【发布时间】:2021-12-01 03:14:51 【问题描述】:

我想测试浮点值是否等于 0.00 或 0.0,我想知道如何正确测试我的变量,所以如果我错了请纠正我:

int main()

    float x1 = -105.00;
    float x2 = 7.00;
    float x3 = 2.00;
    if((x1 == 0.0f || x1 == 0.0))
    
        if((x2 == 0.0f || x2 == 0.0))
        
            if((x3 == 0.0f || x3 == 0.0))
            
                printf("full null\r\n");
            
        
    

所以我想知道这是否是在 c 中测试 float 的最佳方法。

【问题讨论】:

您有什么迹象表明这是错误的?如果你没有,你为什么在这里? 检查0.0(即没有f)是完全多余的。您的变量是 float 并且使用 float 值检查就足够了。 if (x1==0.0f && x3==0.0f && x3==0.0f) .. 应该进行整个检查。请注意,这适用于零,但不适用于“一般”浮点值,这可能无法精确表示。 请注意,“在比较浮点值是否相等时必须小心,因为许多运算的结果不能精确表示,必须四舍五入。在实践中,通常比较浮点数允许为最后一位或多位单位之差。” - en.cppreference.com/w/c/language/operator_comparison 您想比较它是完全为零还是非常接近于零?在前者的情况下,代码是正确的。如果是后者,请检查重复的***.com/questions/4915462/… 值得一读以了解为什么精确的浮点比较可能会出现问题:Is floating point math broken? 【参考方案1】:

要测试float x 是否为零,请使用x == 0.f。当且仅当 x 的值为零时,这将评估为 1。 (由于 C 的各种自动转换,x == 0.x == 0 会产生相同的效果。)

如果x 是从可能存在舍入错误的先前计算得出的浮点数,则x 可能非零,即使“理想”结果1 为零或相反亦然。在这种情况下,是否可以使用x 来决定真实结果取决于具体情况。例如,如果x 与零的距离比舍入误差可能解释的要远,那么理想结果也不能为零。但是,如果x 接近于零,则可能无法从x 确定理想结果是否为零。

脚注

1“理想”结果是指使用没有舍入误差的实数算术而不是浮点算术执行相同计算的结果。

【讨论】:

【参考方案2】:

对于这个特定的示例,即比较所有浮点数是否为零,您所需要的只是

int main()

    float x1 = -105.00;
    float x2 = 7.00;
    float x3 = 2.00;
    if (x1 == 0 && x2 == 0 && x3 == 0)
    
        printf("full null\r\n");
    

没有魔法,没有奇怪的事情发生,只是简单的比较。

【讨论】:

【参考方案3】:

我认为比较浮点数不是一个好主意。您可以检查该值是否真的非常接近零: https://floating-point-gui.de/errors/comparison/

【讨论】:

以上是关于如何在c中测试浮点值?的主要内容,如果未能解决你的问题,请参考以下文章

使用Java迭代所有浮点值

在C语言中的各种赋值是如何转换的?

如何正确地将浮点指针从 C 库传递到其 C# 包装器

如何在 iOS 中限制浮点值

如何在 laravel 中使用浮点值从 DB 中搜索值?

printf%f如何在32位浮点数上运行