-2

簡単な数式を計算する必要がありますが、1行で計算すると、結果は常にゼロになります。しかし、正しい結果は明らかにゼロではありません。そして、それは興味深いですが、表現の部分を分けると、正しい答えが得られます。後でこの結果で除算するので、0にしないでください。

式は次のようになります。

(X-X1)/(X2-X1)

この場合、デルタ:0

double delta = (x - x1) / (x2 - x1);

しかし、このようにデルタは正しくなります:

double top = x - x1;
double bottom = x2 - x1;
double delta = top/bottom;

何か考えがありますか、どうしてこれが起こるのでしょうか?

4

4 に答える 4

11

これは、「浮動小数点値を作成するために使用される整数除算」の典型的なケースです。xx1およびがすべて整数の場合x2、コンパイラは、CおよびC ++の規則に従って、整数計算を使用してとを計算x-x1x2-x1、それらの差を整数除算として除算する必要があります。x2-x1がより大きい場合、x-x1結果はゼロになります[7/14のような正の値を想定しています。-14/-7は明らかに2]です。

簡単な修正は、1つの式の型を浮動小数点型に変換することです。

double delta = static_cast<double>(x - x1) / (x2 - x1);
于 2013-03-21T14:50:39.290 に答える
2

最初のケース、整数/整数、結果はまだ整数であり、次に整数をdoubleに変換します。

2番目のケース、double / doubleの場合、正しい結果が得られます。

于 2013-03-21T14:49:41.577 に答える
1

最初のケースでは、実行int / intしているため、int値が返されます。したがって、分母が分子よりも大きい場合、結果は0に切り捨てられます。

2番目のケースでは、値にdouble/double評価される式を評価しているdoubleため、小数部と整数部が保持されます。

于 2013-03-21T14:50:29.780 に答える
0

整数除算を double にキャストする必要があります。 型キャスト

于 2013-03-21T15:52:18.923 に答える