2016-12-15 3 views
0

Эта программа находит расстояние между двумя точками на плоскости, способной к плавающим точкам. Но я не могу понять (что может быть из-за моего невежества) - проблема с вычислением переменной dist. Он настроен на уравнение Пифагора, которое возвращает то, что должно быть расстоянием. Все остальные переменные в системе верны.Проблемы с литьем и sqrt() в C

У меня проблема с проблемой, но явная ошибка с sqrt() в этом примере. Например, если бы я должен был сделать xdist = 1 со всем остальным, установленным в 0, расстояние должно быть 1. Однако то, что напечатано как dist, равно точно 1072693248. Я нашел только one question, относящийся к этому номеру. Но то, что было упомянуто в ответах, заключалось в том, что только неправильное использование %d в printf вызвало эту проблему, но я вижу (насколько мне известно) нет проблемы с 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

1) имеет смысл использовать 'sqrt()', чем 'sqrtf()' в 'double distance (xdist, ydist) {return sqrtf (pow (xdist, 2.0) + pow (ydist, 2.0));}' 2) Упростить 'двойное расстояние (double xdist, double ydist) { return hypot (xdist, ydist); } ' – chux

ответ

4

Тип аргументов не задан в функции расстояния, поэтому будет использоваться значение по умолчанию. вы должны определить их тип double

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, а функцию расстояния() принимая двойной параметры.

Смежные вопросы