首页 > 解决方案 > 如何使用 NaN 处理无效数据的可能性

问题描述

我正在读一 关于 IEEE 标准的书。我在 p43(58) 中反驳了这部分:

更一般地说,NaN 为程序员提供了一种非常方便的方式来处理在许多情况下可能出现的无效数据或其他错误。假设我们希望编写一个程序来计算一个没有为某些输入值定义的函数。如果输入无效或在函数计算期间发生某些其他错误,通过将函数的输出设置为 NaN,可以避免返回特殊错误消息或代码的需要。

我试过了,return NAN但这似乎不对。更一般地说,我想知道如何NAN在代码中实际使用。那里没有太多关于这个主题的信息。

更新

为了澄清事情,我必须问这个:

如何定义某些函数sqrt,例如某些输入sqrt(-1)未定义的函数NAN?我不明白这是如何发生的,因为将 NAN打印件nan作为输出返回。

正如书中在同一页中所说:

平方根运算提供了使用 NaN 的一个很好的例子。在 IEEE 标准之前,尝试取负数的平方根可能只会导致打印错误消息并返回肯定的结果。用户可能不会注意到有任何问题。在 IEEE 标准的规则下,如果参数为负,则平方根运算无效,标准响应是返回一个 NaN

标签: cfloating-pointnan

解决方案


NaN 由任何类型的无效浮点计算生成,例如执行 0/0 或 Inf-Inf。这可能是使用某些值执行计算的意外结果。

有多种方式可以在程序中使用它。对于简单的基于文本或控制台的应用程序,您的计算结果通常可以使用格式字符串printf按原样打印。"%f"如果出现问题并且计算结果为 NaN,则printf检测到这一点并打印 NaN 而不是任何实际数字。

在其他情况下,您可能希望自己检测结果是否为 NaN。但是有多个 NaN 表示,因此检查if(num == NAN). 但是,您可以使用以下成语:

if(num == num)
    printf("Calculation valid!"); 
else
    printf("Calculation invalid!");

在任何符合 IEEE754 浮点标准的 C 编译器上,如果是包含 NaN 表示之一的浮点/双精度,则表达式的(num == num)计算结果为假。num另一种选择是使用isnan(num)math.h 中的标准库函数。

如果要生成NAN,可以使用nan("")from math.h 或strtod("NAN"). 请记住,这只是各种 NaN 表示中的一种!

编辑:修复了对 C 标准的不正确归属(num != num);谢谢@chux!


推荐阅读