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

Der*_*rek 5 c nan

正如问题所述,我正在使用MIPSPRo C编译器,并且我有一个操作将返回一些数据集的NaN,其中分子和denom都为零.我如何防止这种情况发生?

Mat*_*nen 9

使用if子句?另外我很好奇你为什么要忽略这种数学上的不可能性.在这种情况下,您确定您的输入没有错误/无意义吗?


Ark*_*kku 9

在具有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;
}
Run Code Online (Sandbox Code Playgroud)

正在使用:


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.