gpt4 book ai didi

c - 人们如何在 C89 中检查 nan 和 inf

转载 作者:行者123 更新时间:2023-12-03 09:27:42 24 4
gpt4 key购买 nike

isnan(), isinf()直到 C99 才出现在规范中,无论如何在 C89 中实现这样的功能?

我可以用 if (d * 0 != 0)检查 d 是 NaN 还是 Inf,但我们总是使用选项 -Werror=float-equal 编译我们的项目哪想喊出来:error: no == or != on float point value
那么人们如何在 C89 中检查 nan 和 inf 呢?

最佳答案

自 C99
isinf(x)isnan(x)处理 x 的实数 float 类型并且对于其他类型如 int 未定义. isinf(x)isnan(x)是宏。
isinf(x)isnan(x)float, double, long double 使用相同的名称所以就像一个重载的函数。

isinf

对于 C89,我们可以使用单独的函数来测试 _MAX .请注意,C89 没有定义 long double .

“自己动手”isinf()可以使用下面的。

#include <float.h>
int isinf_f(float x) { return x < -FLT_MAX || x > FLT_MAX; }
int isinf_d(double x) { return x < -DBL_MAX || x > DBL_MAX; }

请注意,C 不要求实现支持无穷大。如果是这样,上述内容永远不会正确。

伊斯南

C89 的“自己动手” isnan()比较棘手。可以在下面作为函数或简单的宏来完成。功能依赖于现代的 Not-a-number 行为,其中 Nan 永远不等于任何东西,甚至不等于它本身。未由 C89 指定,但通常底层浮点系统遵循此。否则,您需要更特定于平台的方法。
/* Note `x` used twice here - so use with caution */
#define my_is_nan(x) ( (x) != (x) )

int isnan_f(float x) { x != x; }
int isnan_d(double x) { x != x; }

请注意,C 不要求实现支持非数字。如果是这样,上述内容永远不会正确。

鉴于 C89 狂野西部时代,我不会假设符合 IEEE 754。 Infinity 和 NAN 正是缺乏正式合规性的任何浮点实现的边缘。祝你好运。

C 允许使用更广泛的 FP 数学,具体取决于 FLT_EVAL_METHOD所以 1.0f / 7.0f可能会使用 double .这让事情有点复杂,但使用真正的函数确实会强制 x表达式转换为所需的类型。

关于c - 人们如何在 C89 中检查 nan 和 inf,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59797359/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com