【问题标题】:IsNan equivalent in CC 中的 IsNan 等价物
【发布时间】:2012-02-11 12:16:18
【问题描述】:

我有一段 Javascript 代码,我正在尝试将其转换为 C 代码。我在将以下行转换为 C 时遇到问题:

var q = (!isNaN(dLat/dPhi)) ? dLat/dPhi : Math.cos(lat1);

你能告诉我C语言中isNan的等价物吗? 谢谢。

【问题讨论】:

  • 您是否要确定是否不为空?如果是这样,请查看:stackoverflow.com/questions/872323/…
  • 我正在尝试确定它是否不是数字(isNan)。您能告诉我如何在 C 中使用 isnan 函数吗?

标签: javascript c


【解决方案1】:

C 在math.h 中有一个isnan 宏(这是C99 添加的)。

仅当参数为 NaN 值时,宏才会返回非零 int

【讨论】:

    【解决方案2】:

    乍一看,原作者似乎只是想检查 dPhi 是否为 0,因此您可能需要替换它。但是,如果您想逐字翻译代码,只需使用 math.h 中的 isnan 宏,如下所示:

    #include <math.h>
    
    double q = (!isnan(dLat/dPhi)) ? dLat/dPhi : cos(lat1);
    

    【讨论】:

    • 这一行给出以下错误:错误 C2143:语法错误:缺少';'在“类型”之前,我使用的是 Visual C++ 6.0
    • 这听起来像是在前面的一行中有一个错字。尝试用尽可能少的行(比如 10 行,包括 main 函数)重现问题。如果在此过程中不能为您解决问题,请提出一个新的 stackoverflow 问题并包含完整的代码。
    • 我按照您的第一眼建议更改了代码: if (dPhi == 0) q = cos(lat1R);否则 q = dLat/dPhi;谢谢。
    • 如果 dLatdPhi 可能是 NaN,则替换 if (dPhi == 0) 会有所不同。在原始 Javascript 中,当任一输入为 NaN 时,将返回 cos(lat1)
    • 校验(dPhi == 0)不一样!如果 dPhi == dLat == 0 或 dPhi == dLat == 无限或@SteveJessop 提到其中一个或两个都是 NaN,则表达式 dLat/dPhi 仅变为 NaN。例如 5/0 是无限的,而不是 NaN。
    【解决方案3】:

    不要觉得自己很愚蠢,但它是:

    isnan(x)
    

    也可以使用fpclassify,查看返回结果是否为FP_NAN

    isnan 最初是在 3BSD 中引入的,但直到 C99 才进入跨平台规范。 fpclasify 出现在 C99 中。他们在math.h

    Microsoft 在 MSVC 中提供 _isnanfloat.h

    【讨论】:

    • C89中有isnan这样的函数吗?
    【解决方案4】:

    假设您的 C 实现是现代的(即除了 MSVC 之外的任何东西),您应该在 math.h 中提供 isnan。否则,if (x!=x) 是检查 NAN 的绝佳方式,如果您不关心它会修改浮点异常标志(几乎没有人使用或关心)。

    【讨论】:

      猜你喜欢
      • 2014-08-12
      • 2011-04-02
      • 2021-10-15
      • 2013-10-20
      • 2011-04-10
      • 2021-12-02
      • 2010-09-14
      • 2016-12-24
      相关资源
      最近更新 更多