2012-03-16 7 views
0

距離を計算するためのコード算出距離が、結果は、 - 以下2147483648

// creating array of cities 
double x[] = {21.0,12.0,15.0,3.0,7.0,30.0}; 
double y[] = {17.0,10.0,4.0,2.0,3.0,1.0}; 

// distance function - C = sqrt of A squared + B squared 
+7

'(x [c1] - x [c2] * x [c1] - x [c2])'は '(x [c1] - x [c2])*(x [c1] ] - x [c2]) '?そして最後のものがあなたが望むものです。 – madth3

+0

'(x [c1] - x [c2] * x [c1] - x [c2])+(y [c1] - y [c2] * y [c1] - y [c2]))あなたはこのコード行が行うことを期待していますか? –

+0

2秒ほどで私を殴る。 – chris

答えて

0

は、演算子の優先順位を覚えている:a - b * c - da - (b * c) - dを意味します。

4

1つの問題は、単に明確にするため、(乗算が減算前に行われる)

変更私も推薦する

((x[c1] - x[c2]) * (x[c1] - x[c2])) + ((y[c1] - y[c2]) * (y[c1] - y[c2])) 

(x[c1] - x[c2] * x[c1] - x[c2]) + (y[c1] - y[c2] * y[c1] - y[c2]) 

order of operationsはあなたをめちゃくちゃにされていることですこれらの計算のいくつかを別々の行で行います(私が好むスタイルの選択は明らかです。これは、(この例のように、発生しやすいと少ない誤差)より保守コードになり、私の意見では

double deltaX = x[c1] - x[c2]; 
double deltaY = y[c1] - y[c2]; 

double distance = sqrt(deltaX * deltaX + deltaY * deltaY); 

かかわらず、コンパイラに何の違いを作るべきではありません。書き直されると、操作の順序に余分な括弧は必要ないことに注意してください。

+3

また、この値をintに代入する必要もありません。 sqrtは整数値を返しません(そしてその上に、関数はdoubleを返すが、zはintを返すと仮定されている) – jzworkman

+0

@jzworkman:元の投稿との関係で良い見解があるが、 'int'がタイプミス'sqrt'は' double'を返すので、彼のサンプル関数も同様です。 –

+0

私はそれが誤字になる可能性があることに同意します。そうでない場合に備えて、それを指摘しておきたいと思います。また、彼はdist関数内で結果を表示するためにcoutを使用してから戻り値を使用しないので、zをすべて返すことも興味深い – jzworkman

0

あなたは*-よりも優先順位が高いので

(x[c1] - (x[c2] * x[c1]) - x[c2])

または

((x[c1] - x[c2]) * (x[c1] - x[c2]))

(x[c1] - (x[c2] * x[c1]) - x[c2])のようになりますしたいです。

0

私は先に行くと、問題のカップルを修正するつもりです:

// creating array of cities 
double x[] = {21.0,12.0,15.0,3.0,7.0,30.0}; 
double y[] = {17.0,10.0,4.0,2.0,3.0,1.0}; 

// distance function - C = sqrt of A squared + B squared 

double dist(int c1, int c2) { 
    double z = sqrt (
     ((x[c1] - x[c2]) * (x[c1] - x[c2])) + ((y[c1] - y[c2]) * (y[c1] - y[c2]))); 
    return z; 
} 

void main() 
{ 
    int a[] = {1, 2, 3, 4, 5, 6}; 
    execute(a, 0, sizeof(a)/sizeof(int)); 


    int x; 

    printf("Type in a number \n"); 
    scanf("%d", &x); 


    int y; 

    printf("Type in a number \n"); 
    scanf("%d", &y); 

double z = dist (x,y); 
cout << "The result is " << z; 
} 

これは、未使用の戻り値を固定し、また、操作の順序、およびint型の間違った変数の型を修正します。