Sto codificando diversi algoritmi di riferimento sia in Java che in C/C++. Alcuni di questi algoritmi utilizzano π. Vorrei che le due implementazioni di ciascun algoritmo producessero i risultati identici, senza arrotondamenti in modo diverso. Un modo per fare ciò che ha funzionato in modo coerente finora è utilizzare una costante pi
definita dall'utente che è esattamente la stessa in entrambe le lingue, come 3,14159. Tuttavia, mi sembra sciocco definire pi quando esistono già costanti ad alta precisione definite nelle librerie Java e GCC.java.lang.Math.PI è uguale a M_PI di GCC?
Ho trascorso un po 'di tempo a scrivere programmi di test rapidi, a consultare la documentazione per ogni libreria e a leggere i tipi in virgola mobile. Ma non sono stato in grado di convincermi che java.lang.Math.PI (o java.lang.StrictMath.PI) è, o non è, uguale a M_PI in math.h.
GCC 3.4.4 (cygwin) math.h contiene:
#define M_PI 3.14159265358979323846
^^^^^
ma questo
printf("%.20f", M_PI);
produce
3.14159265358979311600
^^^^^
che suggerisce che le ultime 5 cifre non sono affidabili .
frattempo, Javadocs dire che java.lang.Math.PI è:
Il valore
double
che è più vicino di qualsiasi altro per pi, il rapporto tra la circonferenza di un cerchio alla sua diametro.
e
public static final double PI 3.141592653589793d
che omette gli discutibili ultime cinque cifre della costante.
System.out.printf("%.20f\n", Math.PI);
produce
3.14159265358979300000
^^^^^
Se avete qualche esperienza in tipi di dati a virgola mobile, si può convincermi che queste costanti di libreria sono esattamente uguali? O che non sono assolutamente uguali?
In C, è possibile eseguire il doppio pi = M_PI; printf ("% lld \ n", pi); per ottenere lo stesso numero intero a 64 bit: 4614256656552045848 –
Grazie Bruno, questo praticamente risponde alla domanda originale. – JeeBee