Estoy codificando varios algoritmos de referencia tanto en Java como en C/C++. Algunos de estos algoritmos usan π. Me gustaría que las dos implementaciones de cada algoritmo produzcan resultados idénticos, sin redondeo de forma diferente. Una forma de hacer esto que ha funcionado consistentemente hasta el momento es usar una constante personalizada pi
que sea exactamente la misma en ambos idiomas, como 3.14159. Sin embargo, me parece tonto definir pi cuando ya hay constantes de alta precisión definidas en las bibliotecas de Java y GCC.¿Es java.lang.Math.PI igual a M_PI de GCC?
Pasé algún tiempo escribiendo programas de prueba rápida, mirando la documentación de cada biblioteca y leyendo sobre tipos de coma flotante. Pero no he podido convencerme de que java.lang.Math.PI (o java.lang.StrictMath.PI) es, o no es, igual a M_PI en math.h.
GCC 3.4.4 (cygwin) math.h contiene:
#define M_PI 3.14159265358979323846
^^^^^
pero esto
printf("%.20f", M_PI);
produce
3.14159265358979311600
^^^^^
lo que sugiere que los 5 últimos dígitos no se puede confiar .
Mientras tanto, Javadocs decir que java.lang.Math.PI es:
El valor
double
que está más cerca que cualquier otra a pi, la relación de la circunferencia de un círculo a su diámetro.
y
public static final double PI 3.141592653589793d
que omite las cuestionables últimos cinco dígitos de la constante.
System.out.printf("%.20f\n", Math.PI);
produce
3.14159265358979300000
^^^^^
Si usted tiene alguna experiencia en los tipos de datos de punto flotante, se puede convencerme de que estas constantes de la biblioteca son exactamente iguales? O que definitivamente no son iguales?
En C, puede hacer doble pi = M_PI; printf ("% lld \ n", pi); para obtener el mismo número entero de 64 bits: 4614256656552045848 –
Gracias Bruno, eso más o menos responde la pregunta original. – JeeBee