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

时间:2010-04-01 20:23:56

标签: c nan

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

4 个答案:

答案 0 :(得分:9)

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

答案 1 :(得分: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;
}

使用中:


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。

答案 2 :(得分:1)

如果您不介意引入一个小错误,可以在分母中添加一个小值,假设您正在进行浮点运算。显然有一些小的价值定义:

DBL_MIN是最小的双

DBL_EPSILON是最小的双击。 x + DBL_EPSILON!= x

所以我会尝试

#include <float.h>
#define EPS DBL_MIN

double divModified(double num, double denom) {
    return num / (denom + EPS);
}

答案 3 :(得分:0)

IEEE 754(浮点规范)表示0.0 / 0.0不是数字,即NaN。如果您希望它是其他任何东西,到目前为止,最好的方法是检测操作数何时在if子句中都为零并返回您更愿意给出的值。也许是这样的:

#define WonkyDiv(a,b)  ((a)==0.0&&(b)==0.0 ? 0.0 : (a)/(b))

float wonkyResult = WonkyDiv(numerator, denominator);