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

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

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

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

dist

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

2147483648

вместо

8

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

15950516170

хранится в

int

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

long long

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

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

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

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

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

  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
Похожие ответы