@Axretit

Почему результат вычисления целочисленный?

621e353540bf2658590792.png
Есть целочисленные переменные и есть x - вещественный. x есть конечный результат.
Я заметил, если расписать все действия отдельно, в отдельных строках, то в конце x, какой бы он ни был, остается целочисленным. Например: x = 1/13; x = 0;

s = pow((r - q),2);
a = a * s;
p = p + 12;
x = a / p;

(все переменный типа int, кроме x, x типа double)

А если все действия писать в одну строку, то x остается вещественным и ответ получается верный.

x = (a * pow((r - q), 2)) / (p + 12);
(все переменный типа int, кроме x, x типа double)
В чем закономерность?
  • Вопрос задан
  • 215 просмотров
Решения вопроса 1
@oleg_ods
Если в выражении участвуют только целочисленные значения, то и результат будет целочисленным.

Если в выражении есть вещественные числа, то результат будет вещественным.

x = (a * pow((r - q), 2)) / (p + 12);


В этом выражении функция pow() возвращает вещественное число, поэтому результат вычислений будет корректным.

Также обрат внимание на порядок выполнения операций. К примеру, в выражении:

x = (5/2 + pow((r - q), 2)) / (p + 12);


5/2 вычислится по правилам целочисленного деления и даст 2(int).
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
fzfx
@fzfx
18,5 дм
закономерность в том, что если операция сложения, вычитания, умножения или деления осуществляется над целочисленными операндами (т. е. не над вещественными), то по её выполнении возвращается целочисленный результат.
так, операции:
71/3
67+5
(99/7)-222*2

вернут целочисленный ответ.
и только в том случае, когда у вас в последовательности операций появляется функция pow, возвращающая всегда вещественный результат, у вас начинают совершаться операции сложения, вычитания, умножения и деления над вещественными числами (начиная с места, где используется результат функции pow).
если вам нужно, чтобы какая-то операция произошла над вещественными операндами, то и в качестве операндов следует использовать вещественные литералы или вещественные переменные.
если не путаю, в C++ для этого можно добавить к числу в конце точку. что-то вроде:
(99/7.)-222*2
либо использовать экспоненциальную запись числа. варианты представлены, например, тут:
https://en.cppreference.com/w/cpp/language/floatin...
Ответ написан
@rPman
pow возвращает тип double
в первом случае ты его преобразуешь в int и все последующие операции идут с целочисленными типами, в т.ч. и /,
а в записи в строку он левую часть выражения до / делает типом double и значит деление тоже вызывается для типа double
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы