0

質問をしているのかどうかさえわかりません。今回は「回り道」の方法を見つけましたが...これが問題であることに気付くのに数日かかりました...まあ、別の機会にただそれを回避することができます... 他の誰かがこれに来ましたか? 実際に等しい double 型の変数を比較すると、結果は ">"...

 printf("compare: %ld ?? %ld\n", (double)( radii(nowX,nowY)*irange2 ),(double)(Rad2*irange2)); getchar();
 if( (double)(radii(nowX,nowY)*irange2)<(double)(Rad2*irange2) ) printf("*** < ***\n"); 
 if( (double)(radii(nowX,nowY)*irange2)>(double)(Rad2*irange2) ) printf("*** > ***\n");
 if( (double)(radii(nowX,nowY)*irange2)==(double)(Rad2*irange2) ) printf("*** == ***\n")
 printf("SECOND = %d\n", ((double)(radii(nowX,nowY)*irange2))<= ( (double)(Rad2*irange2)

出力:

compare: 1509949.440000 ?? 1509949.440000
*** > ***
SECOND = 0

 printf("compare: %ld ?? %ld\n", (long)( radii(nowX,nowY)*irange2 ), (long)(Rad2*irange2)); getchar();
 if( (long)(radii(nowX,nowY)*irange2)<(long)(Rad2*irange2) ) printf("*** < ***\n");
 if( (long)(radii(nowX,nowY)*irange2)>(long)(Rad2*irange2) ) printf("*** > ***\n"); 
 if( (long)(radii(nowX,nowY)*irange2)==(long)(Rad2*irange2) ) printf("*** == ***\n")
 printf("SECOND = %d\n",  ((long)(radii(nowX,nowY)*irange2))<= ( (long)(Rad2*irange2) ) ); getchar();

出力:

compare: 1509949 ?? 1509949

*** == ***
SECOND = 1
4

2 に答える 2

2

ここでの問題は、近似演算を行うために浮動小数点演算が使用されるため、さまざまなエラーを伴う結果が得られることと、数値の完全な値を表示していないことです。

完全に表示すると、数値が等しくないように見えます。

等しいかどうかを比較することは、ここでは有罪の操作ではありません。ほとんどすべての関数は、間違った入力が与えられたときに正しい結果を出すことができません。たとえば、正確に計算された場合にゼロまたは正になる値の平方根を計算すると、以前の丸め誤差のためにわずかに負になる場合、負の数の平方根を取るための例外が発生します。

同様の問題は、近似結果を丸めるとき、近似結果を減算するとき (相対誤差の大きさが大きくなることで有名です)、およびその他の関数で発生します。等しいかどうかを比較するだけでなく、浮動小数点を使用するすべての演算は、結果が概算であるという事実を考慮して使用する必要があります (非常に慎重に設計されていない限り)。

于 2013-01-15T13:13:49.337 に答える
1

これは、計算によって double 値がわずかに異なる可能性があるためです。したがって、等しいかどうかをチェックすることはお勧めしません。代わりに、2 つの double が互いに非常に近いかどうかを確認します。説明については、このリンクも参照してください。

編集:これを明確にするために:これは、格納方法に固有であるため、すべての浮動小数点型に当てはまります。

于 2013-01-15T08:34:04.027 に答える