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