2

我知道由于精度误差,float应该检查一个变量是否等于一个始终具有一定容差的值。但是,即使我手动将float变量设置为 ,情况又如何0.0f

例如,有一个返回距离的函数。

float distance()
{
    float value;
    if(/* ... */)
    {
        // ...
        return value;
    }
    else return 0.0f;
}

我可以安全地将结果转换为 bool 吗?

if(distance())
{
   // ...
}
4

5 回答 5

10

当你写:

if(distance())

您正在检查浮点数是否为零。

您的代码相当于

if(distance() != 0)

这是完全安全的,只有您可以确定它是否具有您需要的含义。

于 2013-05-10T12:59:06.537 回答
3

如果您有一个您期望的确切值,那么绝对没有理由不与该确切值进行比较。只有当您执行计算并获得不精确的结果时,与精确值进行比较是不安全的。而且您通常希望假设任何浮点计算都会给出不精确的结果。

在您的情况下,您将返回一个常量,因此与常量进行比较是安全的。

另一次您想要与精确值进行比较是为了避免奇点。例如,x == 0.0 ? 1.0 : sin(x)/x

于 2013-05-10T13:01:52.527 回答
2

基本上,您是在询问是否可以假设以下行不会触发。

assert(0.0f); 

是的。你可以假设。

于 2013-05-10T12:58:41.100 回答
2

从技术上讲,是的;0.0f 可由IEEE 754 标准表示。但是,问题是它是否总是零,当您期望它是而不是下一个浮点数时。

不过,我不会这样做。

于 2013-05-10T12:59:51.247 回答
1

您担心浮点不准确性是正确的,但您认为在这种情况下它不是问题也是正确的。

您的计算机存储为精确0.0f零以外的任何内容的可能性是天文数字,并且精确浮点零到布尔值的转换是明确定义的。

于 2013-05-10T12:59:12.837 回答