Это может быть довольно уродливо. Компилятор просматривает типы операндов для операции single и переводит оба типа в «больший» тип (например, если один int
, а другой double
, он преобразует int
до double
, затем выполните операцию).
В вашем случае это может привести к довольно неожиданным результатам. Прямо сейчас у вас есть: 2*pi*j*X*Y/n
. Операторы группируются слева направо, так что это эквивалентно ((((2*pi)*j)*X)*Y)/n
. В этом случае это, вероятно, сработает достаточно хорошо - один из операндов в «первой» операции является плавающим, поэтому все остальные операнды будут преобразованы в плавающее число, как вы хотите. Однако, если вы переставите операнды (даже способом, который кажется эквивалентным в обычной математике), результат может быть совершенно другим. Например, если вы измените его на 2*Y/n*pi*j*X
, часть 2*Y/n
будет выполнена с использованием арифметики integer , потому что 2
, Y
и n
- все целые числа. Это означает, что деление будет делаться на целые числа, давая целочисленный результат, и только после того целочисленного результата будет получено, если это целое число будет преобразовано в число с плавающей точкой для умножения на pi
.
Итог: если вы не имеете дело с чем-то вроде большого массива, так что преобразование в меньшие типы может реально сэкономить немало памяти, вам, как правило, гораздо лучше оставить все операнды одного типа, если это возможно , Я также хотел бы отметить, что в этом случае ваша попытка «интеллектуального управления памятью», вероятно, в любом случае не принесет пользы - на типичном текущем компьютере long int
и float
являются 32-битными, поэтому они оба используют одинаковое количество памяти в любом случае. Также обратите внимание, что exp
принимает double
в качестве операнда, так что даже если вы сделаете float
математику для остальных, он все равно будет повышен до double
. Также обратите внимание, что преобразования из int
в float
(и обратно) могут быть довольно медленными.
Если вы действительно имеете дело только с полдюжиной переменных или около того, вам почти наверняка лучше оставить их как double
и покончить с ними. Преобразование в комбинацию float
и long
сэкономит около 14 байтов хранения данных, но затем добавит (около) 14 байтов дополнительных инструкций для обработки всех преобразований между int
, float
и double
в нужное время, так что в итоге вы получите более медленный код, который в любом случае использует столько же памяти.