Yo entiendo por qué tenemos esto en las cabeceras estándar:
#define M_PI 3.14159265358979323846 // pi
Sin embargo, no veo mucho de que dichos estudios:
#define M_PI_2 1.57079632679489661923 // pi/2
#define M_PI_4 0.785398163397448309616 // pi/4
#define M_1_PI 0.318309886183790671538 // 1/pi
#define M_2_PI 0.636619772367581343076 // 2/pi
¿Hay alguna ventaja en el uso de estos en lugar de M_PI/2
, M_PI/4
, 1/M_PI
y 2/M_PI
en código real? (En el 2020 y más allá?)
No son las expresiones enunciadas de salida mucho más legible?
Estoy pidiendo un par de razones realmente.
En primer lugar, un día he mezclado accidentalmente M_PI_2
y M_2_PI
(y tal vez incluso 2 * M_PI
). Tomó un tiempo para averiguar algo estaba mal, y después de eso tomó otro tiempo para averiguar qué era exactamente la causa raíz. Aún así creo que no es muy obvio lo que M_PI_2
y M_2_PI
media, si son sólo de lectura de códigos de usarlos y no ve las definiciones. Y ¿por qué debería memorizar algo así? Por lo tanto, es seguro decir que el uso de estas definiciones es en realidad un anti-patrón que se degrada la legibilidad del código?
En segundo lugar, teniendo estas definiciones disponible todavía puede ser un problema, por ejemplo, en Windows (Visual C ++) . En lugar de definir todo esto, prefiero definir solamente M_PI
, y luego digo M_PI/2
, y no M_PI_2
en el código. ¿Se me escapa algo?
Debido a 2 y 4 son potencias de dos, M_PI_2
y M_PI_4
realmente son redundantes y 100% equivalente a M_PI/2
y M_PI/4
. Sin embargo, M_1_PI
no es necesariamente equivalente a 1/M_PI
; el último tiene dos redondeos (aproximación de pi, entonces división inexacta) en lugar de sólo uno (aproximación de 1 / pi).