В алгоритмах я использую такие константы:Что лучше, макросы или встроенные функции для квадратных или sqrt констант?
sqrt(3)
pow(M_PI, 2)
К сожалению, препроцессор C не достаточно умен, чтобы предварительно вычислить эти константы. Есть ли дополнительный уровень предварительной обработки, который можно использовать с GCC или любым другим компилятором C?
Я в настоящее время реализованы эти две константы, как:
#define SQRT3 1.7320508
#define PIPI (M_PI*M_PI)
Но я чувствую, используя малоизвестные имена, как PIPI
(что также означает, что мочиться на французском) не является лучшим решением. Я думаю, было бы лучше написать:
inline float square(float x) {
return x * x;
}
Однако это невозможно для квадратного корня. По крайней мере, я могу получить достаточное приближение с этим:
inline float sqrt_approx(float z)
{
int val_int = *(int*)&z;
val_int -= 1 << 23;
val_int >>= 1;
val_int += 1 << 29;
return *(float*)&val_int;
}
К сожалению, и опять же, компилятор не достаточно умен, чтобы интерпретировать sqrt_approx(3)
в 1,73
Есть ли лучший способ справиться с этими ограничениями C ?
Мы находимся в 2015 году, у нас есть роверы, которые бродят по Марсу, и мы по-прежнему имеем дело с компиляторами C, которые заставляют нас чувствовать себя в 80-х годах. Я ошибаюсь?
Вы пытались назвать константу 'PI_SQUARED' вместо этого? Я не понимаю, что не так с определением короткого числа констант, поскольку они не должны сильно меняться. – moooeeeep
Где вы нуждаетесь в них, рассчитанные препроцессором? – mafso
@moooeeeep Ну, это нужно рассматривать как более общий пример. Я чувствую себя более читаемым, чтобы видеть 'sqrt (3)/2' где-то в коде, чем' HALF_SQRT3'. – nowox