如何在 ANSI C 中定义 NaN 值?

9

可能是重复问题:
C语言中的NaN字面量?

我正在用 ANSI C 编写一个函数,该函数接收两个数字作为参数。这些参数的类型可以是 intfloat。根据我的过滤器,这些数字可能有效也可能无效。如何返回一些表示失败的值?返回类型是 float。我首先想到的是使用 NaN 抽象类型。但我不知道如何在 ANSI C 中表示它。

(对不起我的英语不好,英语不是我的母语)


@OliCharlesworth:但这是C99。 - Jack
其中一个答案建议使用 0.0/0.0 - Oliver Charlesworth
1
没有绝对可移植的方法,NaN在C89中不存在,并且从C99开始不是强制性的。 - effeffe
4个回答

13

NaN不是一个抽象类型。它是一个浮点数数据的值。

如果你所说的“ANSI C”是指标准C(这实际上是该术语的含义,只要它有一个),则需要包含<math.h>并使用NAN宏来生成NaN,使用isnan(x)来检测NaN。

如果你所说的“ANSI C”实际上是已经被替换的C89标准(即使它不是形式上正确的),则可以使用0./0.生成NaN值,并使用x!= x来检查是否为NaN。


你甚至可以在你的代码中创建一个小包装器,检测代码是否未编译为C99或更高版本,然后将宏NANisnan定义为你的答案。 - Will
@Will:当然可以,但我认为0./0.并不符合NAN宏的要求(即它应该可用于静态初始化);不过这可能对大多数用户来说并不是一个问题。 - Stephen Canon
2
@StephenCanon 0. / 0. 是一个常量表达式,因此可以进行静态初始化。 - ouah

5

如果我的“过滤器”认为该数字无效,该如何返回一些表示失败的值?

可以使用以下方法而不是将数字与 NaN 进行比较:

if (x != x)  // x is NaN

如评论中提到的,您可以在C89中使用表达式0.f / 0.f来产生一个float NaN值。

OP 没有询问如何检查 NaN。 - Lightness Races in Orbit

2

你不能这样做,需要返回两个变量,一个用于值,一个用于失败标志。

例如,你可以设置thing,使函数在正常操作的情况下返回true,在失败(NaN)的情况下返回false

存储结果的变量作为参数通过引用传递,并在成功的情况下保存返回值。

BOOL myFunction(int inInt, float inFloat, float *outResult)
{
    /*
        PROCESSING HERE
    */

    // in case of failure

    if( /* failure condition here */ )
    {
        *outResult = 0;
        return false;
    }

    *outResult = /* your result */

    return true;
}


// how to use the function

int a;
float b;
float result;
BOOL success;

success = myFunction(a, b, &result);

if(success)
{
    // do whatever with your "result"
}
else
{
    // NaN
}

-2

有类似这样的东西

if(your_variable != your_variable)
{
    return 0; //catch 0 as the failure returned value
}
else
{
    //your code
}

-1 是因为这个答案没有解释任何东西,同时包含的代码对于不知道如何使用 NaN 并能立即发现它的人来说会非常困惑。此外,0 可能是一个完全合理的返回值。 - Lightness Races in Orbit

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接