c - 如何使用 NaN 处理无效数据的可能性
问题描述
我正在读一本 关于 IEEE 标准的书。我在 p43(58) 中反驳了这部分:
更一般地说,NaN 为程序员提供了一种非常方便的方式来处理在许多情况下可能出现的无效数据或其他错误。假设我们希望编写一个程序来计算一个没有为某些输入值定义的函数。如果输入无效或在函数计算期间发生某些其他错误,通过将函数的输出设置为 NaN,可以避免返回特殊错误消息或代码的需要。
我试过了,return NAN
但这似乎不对。更一般地说,我想知道如何NAN
在代码中实际使用。那里没有太多关于这个主题的信息。
更新:
为了澄清事情,我必须问这个:
如何定义某些函数sqrt
,例如某些输入sqrt(-1)
未定义的函数NAN
?我不明白这是如何发生的,因为将 NAN
打印件nan
作为输出返回。
正如书中在同一页中所说:
平方根运算提供了使用 NaN 的一个很好的例子。在 IEEE 标准之前,尝试取负数的平方根可能只会导致打印错误消息并返回肯定的结果。用户可能不会注意到有任何问题。在 IEEE 标准的规则下,如果参数为负,则平方根运算无效,标准响应是返回一个 NaN
解决方案
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!
推荐阅读
- css - 如何正确修复 ScrollView 使其行为类似于常规视图但具有垂直滚动?
- python - 要求搜索时出现 Python AI 错误
- python - 熊猫:用第一个非空值为用户填写列的值
- python - 在保留其中一个数据框的索引的同时,在列上合并熊猫数据框的最快方法是什么?
- sql - 如何使用 Postgres 在分组的列/行中添加值
- flutter - Why does this function block flutter's ui?
- javascript - 在 Nodejs 事件循环的哪个阶段解决了 Promise 的回调被执行?
- typescript - 如何在 FieldResolver 中访问查询参数
- python - 当另一个模型的另一个字段值更改时,如何修改模型的字段值?
- json - Reactjs将带有数组的数据发布到数据库中