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