2017-09-08 5 views
0

私は、2つの座標点(x、y)間の距離を単純に計算するクラス用のプログラムを作成しています。値の計算を防止する値タイプ?

differenceofx1 = x1 - x2; 
differenceofy1 = y1 - y2; 
squareofx1 = differenceofx1 * differenceofx1; 
squareofy1 = differenceofy1 * differenceofy1; 
distance1 = sqrt(squareofx1 - squareofy1); 

距離を計算するとうまくいきます。しかし、結果が正方形でない平方根の平方根であるか、または入力順序のためにx1とx2/y1とy2の差が負であるような状況があります。距離が0.00000の場合は、明らかに0以上です。すべての変数にdoubleを使用していますが、代わりにfloatを使用して負の可能性を持たなければなりませんか?精度も8に設定しましたが、なぜ正しく計算されないのか分かりません。

私は質問の単純さのために申し訳ありません、私は初心者よりも少しです。

+4

通常、距離の場合は、入力の順序が「問題ではありません」のため、distance1 = sqrt(squareofx1 + squareofy1);「 – fefe

+1

」またはx1とx2/y1とy2の差が負です。正方形は正の値になります。 – tkausl

+0

'float'は単精度浮動小数点値です。 'double'は倍精度浮動小数点値です。どちらの型も浮動小数点値に使用されますが、 'double'は精度が高く、より大きいまたはより小さい数値を表すことができます。 –

答えて

0

距離式を間違って使用しています distance1 = sqrt(squareofx1 + squareofy1); の代わりに distance1 = sqrt(squareofx1 - squareofy1); squareofx1がsquareofy1より小さい場合、数式が間違っているため、実際の座標の場合には負の数のsqrtを使用できないため、エラーが発生します。

0

最初にと入力すると、数式が正しく表示されず、@ fefeと記載されているようにdistance1 = sqrt(squareofx1 + squareofy1)に変更されます。ところであなたのすべての計算は、1行のコードで表すことができます。

distance1 = sqrt((x1-x2)*(x1-x2) + (y1-y2)*(y1-y2)); 

differenceofx1differenceofy1squareofx1、のような変数を使用する必要はありませんsquareofy1あなたは、これらの変数に格納された結果を使用していない限り、もう一度あなたのプログラムで。

第2の,Doubleは、floatよりも精度が高くなります。小数点以下の桁数で6〜7桁以上の精度が必要な場合Double else floatも機能します。詳細についてはFloat vs Double