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

StackOverflow https://stackoverflow.com/questions/2563418

  •  23-09-2019
  •  | 
  •  

作为问题状态中,我使用如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;
}

在使用:


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。

其他提示

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

如果你不介意引入一个小错误,你可以一个小值添加到分母,假设你正在做的浮点运算。显然已经定义了一些小的值:

DBL_MIN是最小的双

DBL_EPSILON是最小的双S.T. X + DBL_EPSILON!= X

所以我想尝试

#include <float.h>
#define EPS DBL_MIN

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

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);
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top