Member 13685035 Ответов: 5

Программа предназначена для вычисления общего расстояния между 5 координатами, никакой ошибки компиляции, но ошибка "-1.#IND00" отображается в командной строке


#include<stdio.h>
#include<math.h>
#define SQR(x) ((x)*(x))
main()
{
	int arr[5][2]={{1,2},{2,2},{3,1},{4,4},{4,6}};   /*x and y coordinates written in each row*/
	int i,j=0,k=1;
	float s=0;
	
	for(i=0;i<4;i++)
	{
		
		
		s=s+sqrt(SQR(arr[i][j]-arr[i+1][j])-SQR(arr[i][k]-arr[i+1][k]));
		
	}
	
	printf("%f",s);
}


Что я уже пробовал:

Я попробовал написать макрос в правильном формате и проверил скобки

CPallini

Странная формула расстояния, которую вы используете. :-)

Rick York

Я думаю, что это фундаментальная проблема.

5 Ответов

Рейтинг:
2

Jochen Arndt

Это отображается, когда результат операции с плавающей запятой не является допустимым числом (NaN). В вашем случае он, скорее всего, получен путем передачи отрицательного аргумента в sqrt() функция.

Вы можете проверить это, распечатав промежуточное значение:

float temp1 = SQR(arr[i][j] - arr[i+1][j]);
float temp2 = SQR(arr[i][k] - arr[i+1][k]);
float temp = temp1 - temp2;
printf("temp = %f - %f = %f\n", temp1, temp2, temp);
s += sqrt(temp);

В вашем случае может быть достаточно передать абсолютное значение в sqrt() (но вы должны это подтвердить):
s += sqrt(fabs(temp));


Рейтинг:
1

OriginalGriff

Вот тут-то и пригодится отладчик: вам нужно точно посмотреть, что происходит. Без него вам придется вернуться к "старомодным" методам: протоколированию.

Добавьте операторы в свой код, чтобы попытаться выяснить, как далеко он заходит:

for(i=0;i<4;i++)
{
    printf("%d, %f\n", i, s);

    s=s+sqrt(SQR(arr[i][j]-arr[i+1][j])-SQR(arr[i][k]-arr[i+1][k]));

}
В моей системе это приводит к тому, что:
0, 0.000000                                                                                
1, 1.000000                                                                                
2, 1.000000                                                                                
3, -nan
Это указывает на то, что до вашего окончательного расчета значение уже является мусором.
На самом деле, это мусор после первой итерации!.
Поэтому начните пытаться понять, почему: Разбейте свою единственную строку кода и посмотрите, что она генерирует:
float s=0, t1, t2;

for(i=0;i<4;i++)
{
    t1 = SQR(arr[i][j]-arr[i+1][j]);
    t2 = SQR(arr[i][k]-arr[i+1][k]);
    printf("%d, %f, %f, %f\n", i, t1, t2, s);
    s=s+sqrt(t1 - t2);

}
Запустите этот код, и причина, по которой квадратный корень терпит неудачу, станет очень очевидной!
Попробуйте сами, и посмотрите, что вы можете сделать!


Рейтинг:
0

phil.o

-1.#IND000 означает NaN (Не Число).
Это связано с тем, что в какой-то момент Вы пытаетесь вычислить квадратный корень (sqrt) отрицательного числа.
Правильная формула такова
sqrt(SQR(arr[i][0] - arr[i + 1][0]) + SQR(arr[i][1] - arr[i + 1][1]))

Более того, я не думаю, что макрос для вычисления квадрата здесь уместен, функция может быть лучше, потому что она будет вычислять входное значение только один раз, тогда как ваши макросы приводят к тому, что входные значения вычисляются дважды каждый раз. Я не думаю, что вам нужны переменные j и k любой.


Рейтинг:
0

KarstenK

Я не дам вам решение, но несколько советов.

1. Не используйте макросы, но функции
2. используйте некоторые структурированные стили кодирования, используйте ТОЧКА структура
3. проверьте наличие допустимых входных данных в функция sqrt функция (в квадрате не требуется)

int square(int) {
  return x * x;
}
  POINT pt:
  pt.x = 1;
  pt.y = 2;

  int dist = ...;

  if( dist < 0 ) {
    dist = -dist;
  }
  
  s= sqrt( dist ); //