どのように私はMIPSPro Cコンパイラに代わりのNaNのゼロを返すために0.0 / 0.0を強制できますか?
質問
質問の状態として、私はMIPSPRo Cコンパイラを使用しています、と私は、分子とdenomの両方がゼロであるいくつかのデータ・セットのためには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をサポートしていません。
他のヒント
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);