Количество цифр в определении макроса почти наверняка не повлияет на производительность во время выполнения.
Расширение макроса текстовое. Это означает, что если у вас есть:
#define PI 3.14159... /* 50 digits */
тогда каждый раз, когда вы ссылаетесь на PI
в коде, для которого видно это определение, это будет так, как если бы вы выписали 3.14159...
.
C имеет только три типа с плавающей запятой: float
, double
и long double
. Там размеры и точность определяются реализацией, но обычно они составляют 32 бита, 64 бита и что-то шире 64 бит (размер long double
обычно больше варьируется от системы к системе, чем два других).
Если вы используете PI
в выражении, оно будет оцениваться как значение определенного типа. И на самом деле, если литерал не имеет суффикса L
, он будет типа double
.
Итак, если вы пишете:
double x = PI / 2.0;
как будто вы написали:
double x = 3.14159... / 2.0;
Компилятор, вероятно, оценит деление во время компиляции, генерируя значение типа double
. Любая дополнительная точность литерала будет отброшена.
Чтобы убедиться в этом, вы можете попробовать написать небольшую программу, использующую макрос PI
, и изучить ассемблерный листинг.
Например:
#include <stdio.h>
#define PI 3.141592653589793238462643383279502884198716939937510582097164
int main(void) {
double x = PI;
printf("x = %g\n", x);
}
В моей системе x86_64 сгенерированный машинный код не имеет ссылки на значение полной точности. Инструкция, соответствующая инициализации:
movabsq $4614256656552045848, %rax
где 4614256656552045848
— это 64-битное целое число, соответствующее двоичному представлению числа двойной точности IEEE, максимально близкому к 3.141592653589793238462643383279502884198716939937510582097164
.
Фактическое сохраненное значение с плавающей запятой в моей системе оказывается точно таким:
3.1415926535897931159979634685441851615905761718750000000000000000
из которых только около 16 десятичных цифр являются значимыми.
person
Keith Thompson
schedule
13.03.2014
math.h
. Вырвите (вероятно, неправильные) значения и используйте предоставленные компилятором. - person vonbrand   schedule 14.03.2014long double
вместоdouble
илиfloat
может повлиять на производительность. - person Niklas B.   schedule 14.03.2014