Определить, почему во втором варианте программы происходит переполнение при вычислении переменной dist - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Добрый вечер. Не могу понять, почему во втором варианте программы происходит переполнение при вычислении переменной

dist

на таком тесте:
8066 7339 19155 -90534 -60666
В итоге программа выводит

2147483648

вместо

8

. Или временный результат выражения

15950516170

хранится в

int

, а потом уже преобразуется в

long long

? Объясните, пожалуйста.
Листинг программы
  1. #include <stdio.h>
  2. #include <math.h>
  3. int main()
  4. {
  5. long long r, x, y, xx, yy;
  6. scanf("%lld%lld%lld%lld%lld", &r, &x, &y, &xx, &yy);
  7. long long dist = (x - xx) * (x - xx) + (y - yy) * (y - yy);
  8. printf("%lld\n", (int) ceil(pow(dist, 0.5) / (2 * r)));
  9. return 0;
  10. }
Листинг программы
  1. #include <stdio.h>
  2. #include <math.h>
  3. int main()
  4. {
  5. int r, x, y, xx, yy;
  6. scanf("%d%d%d%d%d", &r, &x, &y, &xx, &yy);
  7. long long dist = (x - xx) * (x - xx) + (y - yy) * (y - yy); // dist переполняется
  8. printf("%lld\n", (int) ceil(pow(dist, 0.5) / (2 * r)));
  9. return 0;
  10. }

Решение задачи: «Определить, почему во втором варианте программы происходит переполнение при вычислении переменной dist»

textual
Листинг программы
  1. #include <stdio.h>
  2. #include <math.h>
  3.  
  4. int main(void)
  5. {
  6.     int r, x, y, xx, yy;
  7.     long long dist;
  8.  
  9.     scanf("%d%d%d%d%d", &r, &x, &y, &xx, &yy);
  10.     dist = (x - xx) * (x - xx) + (y - yy) * (y - yy);
  11.     printf("%d\n", (int) ceil(pow(dist, 0.5) / (2 * r)));
  12.  
  13.     return 0;
  14. }

Объяснение кода листинга программы

В данном коде выполняются следующие действия:

  1. Объявляются переменные:
    • r, x, y, xx, yy (количество переменных - 5)
    • dist (переменная для вычисления расстояния)
  2. С помощью функции scanf() вводятся значения переменных r, x, y, xx, yy.
  3. Вычисляется переменная dist по формуле dist = (x - xx) (x - xx) + (y - yy) (y - yy).
  4. С помощью функции printf() выводится значение переменной dist, округленное до ближайшего целого числа с помощью функции ceil().
  5. Выполняется вычисление значения переменной dist по формуле sqrt(dist) / (2 * r)).
  6. С помощью функции printf() выводится округленное значение переменной dist.
  7. Программа завершается, возвращая 0. Однако, в представленном коде возможно переполнение при вычислении переменной dist, если значения переменных x, y, xx, yy будут слишком большими. Это связано с тем, что переменная dist имеет тип long long, который может хранить только очень большие значения. Если значения переменных будут слишком большими, то при вычислении выражения (x - xx) (x - xx) + (y - yy) (y - yy) результат может превысить максимальное значение, которое может хранить переменная dist, что приведет к переполнению.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

15   голосов , оценка 4.333 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы