【问题标题】:How to define NaN value in ANSI C? [duplicate]如何在 ANSI C 中定义 NaN 值? [复制]
【发布时间】:2012-12-19 22:41:02
【问题描述】:

可能重复:
NaN Literal in C?

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

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

【问题讨论】:

  • @OliCharlesworth:但它是 C99
  • 建议的答案之一0.0/0.0
  • 没有绝对可移植的方式,NaN 在 C89 中不存在,并且在 C99 中也不是强制性的。

标签: c floating-point nan c89


【解决方案1】:

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

如果“ANSI C”是指标准 C(这是该术语的实际含义,尽管它有一个),包括 <math.h> 并使用 NAN 宏来生成 nan,然后 @ 987654323@检测一个。

如果您所说的“ANSI C”实际上是指已被长期替换的 C89 标准(有些人打算这样做,即使它在形式上并不正确),您可以使用 0./0. 生成 NaN 值,并使用x != x.

【讨论】:

  • 您甚至可以在代码中创建一个小型包装器,用于检测代码是否未编译为 C99 或更高版本,然后将宏 NANisnan 定义为您的答案。
  • @Will:当然,虽然我不认为0./0. 正式满足NAN 宏的要求(即它应该可用于静态初始化);对于大多数用户来说,这可能并不担心。
  • @StephenCanon 0. / 0. 是常量表达式,所以静态初始化是可以的。
【解决方案2】:

根据我的“过滤器,数字可能无效的问题,那么我如何返回一些值意味着失败?

您可以使用以下命令,而不是将数字与 NaN 进行比较:

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

如 cmets 中所述,您可以使用此表达式 0.f / 0.f 在 C89 中生成 float NaN 值。

【讨论】:

  • OP 没有询问如何检查 NaN。
【解决方案3】:

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

例如,您可以设置一些东西,以便函数在正常操作的情况下返回 truefalse 在失败的情况下 (NaN)。

存储结果的变量作为参数通过引用传递,成功时将保存返回值。

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
}

【讨论】:

    【解决方案4】:

    有这样的东西

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

    【讨论】:

    • -1 因为这个答案没有解释任何内容,同时包含的代码对于尚未了解如何使用 NaN 并能够立即发现它的任何人来说都是非常混乱的。也因为0 可能是一个完全合理的返回值。
    猜你喜欢
    • 2011-09-08
    • 1970-01-01
    • 2011-11-02
    • 2014-12-14
    • 2011-09-07
    • 2018-10-07
    • 1970-01-01
    • 2019-07-14
    • 1970-01-01
    相关资源
    最近更新 更多