1

Xの二乗が常に無限大になり、結果として得られる距離も無限大になるという問題が発生していますが、自分の計算に問題はありません。

// Claculate distance

xSqr = (x1 - x2) * (x1 - x2);
ySqr = (y1 - y2) * (y1 - y2);
zSqr = (z1 - z2) * (z1 - z2);

double mySqr = xSqr + ySqr + zSqr;

double myDistance = sqrt(mySqr);

プログラムを実行すると、各座標のユーザー入力を取得し、計算を実行した後の距離を表示します。

4

3 に答える 3

9

入力が単精度floatの場合、倍精度演算を強制しても問題ありません。

xSqr = double(x1 - x2) * (x1 - x2);
//     ^^^^^^

入力がすでに倍精度であり、より大きな浮動小数点型を使用できない場合は、オーバーフローを避けるためにユークリッド距離の計算を再配置する必要があります。

r = sqrt(x^2 + y^2 + z^2)
  = abs(x) * sqrt(1 + (y/x)^2 + (z/x)^2)

ここxで、 は 3 つの座標距離の中で最大です。

コードでは、次のようになります。

double d[] = {abs(x1-x2), abs(y1-y2), abs(z1-z2)};
if (d[0] < d[1]) swap(d[0],d[1]);
if (d[0] < d[2]) swap(d[0],d[2]);
double distance = d[0] * sqrt(1.0 + d[1]/d[0] + d[2]/d[0]);

または、hypot同様の手法を使用してオーバーフローを回避する を使用します。

double distance = hypot(hypot(x1-x2,y1-y2),z1-z2);

ただし、これは 2011 年より前の C++ ライブラリでは利用できない場合があります。

于 2013-01-28T18:35:49.243 に答える
2

これを試して:

long double myDistance=sqrt(pow(x1-x2,2.0)+pow(y1-y2,2.0)+pow(z1-z2,2.0));
于 2013-01-28T18:20:46.167 に答える
0

私は何が起こっているのかを理解しました.x1、y1、z1を設定するコードをコピーして貼り付け、x2 y2とz2に変更するのを忘れていました.

于 2013-01-28T18:37:57.320 に答える