2016-12-15 19 views
0

このプログラムは、浮動小数点が可能な平面上の2点間の距離を求めます。しかし、私が理解できないことは(私の無知に起因するかもしれない)dist変数の計算に伴う問題です。ピタゴラス式に設定され、距離になるべきものが返されます。システム内の他のすべての変数は正しいです。C言語でのキャスティングとsqrt()の問題

この例では、sqrt()の明白なバグがありますが、ほとんど問題はありますか?たとえば、xdist = 1を0に設定した場合、距離は1になります。ただし、distは正確には1072693248です。この番号に関連するone questionしか見つかりませんでした。しかし答えに記載されているのは、printf%dの間違った使用だけでその問題が発生していたことですが、私が知っているところではprintfの問題はなく、プログラムのどこにでも書いてあります。正しい値を得るための解決策は何ですか?

double distance(xdist, ydist) 
{ 
    return sqrtf(pow(xdist, 2.0) + pow(ydist, 2.0)); 
} 

int main() 
{ 
    double x1, y1, x2, y2; 

    double xdist, ydist, dist; 

    int i; 

    for (i = 1; i <= 2; i++) 
    { 
      printf("%d: Enter an x and y coordinate:\n", i); 
      switch (i) 
      { 
       case 1: 
        scanf("%lf", &x1); 
        scanf("%lf", &y1); 
        continue; 
       case 2: 
        scanf("%lf", &x2); 
        scanf("%lf", &y2); 
        continue; 
      } 
    } 

    xdist = fabs(x2 - x1); 
    ydist = fabs(y2 - y1); 

    dist = distance(xdist, ydist); 

    printf("\nxdist = %.2f, ydist = %.2f\n", xdist, ydist); 
    printf("The distance between coordinates \n(%.2f, %.2f) to (%.2f, %.2f) \nis %.2f.", x1, y1, x2, y2, dist); 

    return 0; 
} 
+1

'double distance(xdist、ydist)' ...私はCプログラミングについて無知にしますが、 'xdist'と' ydist'の型を宣言する必要はありませんか? –

+0

また、xとy座標の差の絶対値を取る必要はありません。とにかく記号が失われる(y = x^2のコドメインで、xは複素数ではなく実数です。y> = 0)。 –

+0

) 'double distance(xdist、ydist){return sqrtf(pow(xdist、2.0)+ pow(ydist、2.0));}' 2で 'sqrtf()'よりも 'sqrt ) 'double distance(double xdist、double ydist)を簡略化する { リターンhypot(xdist、ydist); } ' – chux

答えて

4

引数の型は距離関数で定義されていないので、デフォルトのintになります。彼らのタイプをダブルで定義する必要があります

double distance(double xdist, double ydist) 
+0

私の考えはまさに... –

0

私の解決策が見つかりました。 scanf()の問題は浮動小数点の奇妙な印刷を引き起こしたと私は思います。私は "%lf"を "%f"に切り替えてから "%lf"に再度切り替えました。しかし、その中で正確に何が修正されたのか分かりません。

#include <math.h> 
#include <stddef.h> 
#include <stdio.h> 

double distance(double xdist, double ydist) 
{ 
    return hypot(xdist, ydist); 
} 

int main() 
{ 
    double x1, y1, x2, y2; 

    double xdist, ydist, dist; 

    int i; 

    for (i = 1; i <= 2; i++) 
    { 
      printf("%d: Enter an x and y coordinate:\n", i); 
      switch (i) 
      { 
       case 1: 
        scanf("%lf", &x1); 
        scanf("%lf", &y1); 
        continue; 
       case 2: 
        scanf("%lf", &x2); 
        scanf("%lf", &y2); 
        continue; 
      } 
    } 

    xdist = x2 - x1; 
    ydist = y2 - y1; 

    dist = distance(xdist, ydist); 

    printf("\nxdist = %.2f, ydist = %.2f\n", xdist, ydist); 
    printf("The distance between coordinates \n(%.2f, %.2f) to (%.2f, %.2f) \nis %.2f.", x1, y1, x2, y2, dist); 

    return 0; 
} 

しかし、私は推測した場合、何がこれは関数hypotを使用する()、ファブの除去()ydistとxdistを見つけるために、ダブルを取る距離()関数を簡略化した固定:最終的なコードですパラメーター。