c - 我如何在 MIPSPro C 编译器中强制 0.0/0.0 返回零而不是 NaN?

标签 c nan

正如问题所述,我正在使用 MIPSPRo C 编译器,并且我有一个操作将返回 NaN 对于一些分子和分母都为零的数据集。我该如何避免这种情况发生?

最佳答案

在带有 MIPSPro 编译器的 SGI 系统上,您可以使用 sigfpe.h 中的工具非常精确地设置各种浮点异常的处理。碰巧,零除以零就是这样一种情况:

#include <stdio.h>
#include <sigfpe.h>

int main (void) {
    float x = 0.0f;
    (void) printf("default %f / %f = %f\n", x, x, (x / x));
    invalidop_results_[_ZERO_DIV_ZERO] = _ZERO;
    handle_sigfpes(_ON, _EN_INVALID, 0, 0, 0);
    (void) printf("handled %f / %f = %f\n", x, x, (x / x));
    return 0;
}

正在使用中:


arkku@seven:~/test$ cc -version
MIPSpro Compilers: Version 7.3.1.3m
arkku@seven:~/test$ cc -o sigfpe sigfpe.c -lfpe
arkku@seven:~/test$ ./sigfpe
default 0.000000 / 0.000000 = nan0x7ffffe00
handled 0.000000 / 0.000000 = 0.000000

如您所见,设置 _ZERO_DIV_ZERO 结果会更改同一除法的结果。同样,您可以处理除以零的常规除法(例如,如果您不希望结果为无穷大)。

当然,这些都不是标准的;在每次除法之后检查 NaN 会更方便,而且在之前检查零会更好。 C99 在 fenv.h 中提供了对浮点环境的一些控制,但我认为没有适合它的东西可用。无论如何,我的旧 MIPSPro 不支持 C99。

关于c - 我如何在 MIPSPro C 编译器中强制 0.0/0.0 返回零而不是 NaN?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2563418/

相关文章:

java - IsNan() 方法可用性

C# - 无限数

c - Windows Driver 时间戳函数

c - 第一个示例由于编译器错误而无法编译

c - 需要一个 C 编程逻辑代码来解决一个简单的难题

c - 使用 KEY 的 Openssl/libcrypto AES 128 编码

c - 条件 (C) 中的可能赋值

fortran - 在 Fortran 的求和中忽略 NaN 项

javascript - typeof 90/'hi' 是 NaN 而 typeof (90/'hi' ) 是数字。为什么这样?

python - Pandas fillna() 按特定顺序排列