Je suis en train de coder plusieurs algorithmes de référence en Java et en C/C++. Certains de ces algorithmes utilisent π. Je voudrais que les deux implémentations de chaque algorithme produisent résultats identiques, sans arrondir différemment. Une façon de faire cela qui a toujours fonctionné est d'utiliser une constante pi
personnalisée qui est exactement la même dans les deux langues, comme 3.14159. Cependant, il me semble idiot de définir pi quand il y a déjà des constantes de haute précision définies à la fois dans les bibliothèques Java et GCC.Est-ce que java.lang.Math.PI est égal à M_PI de GCC?
J'ai passé du temps à écrire des programmes de test rapides, à examiner la documentation de chaque bibliothèque et à lire les types à virgule flottante. Mais je n'ai pas été capable de me convaincre que java.lang.Math.PI (ou java.lang.StrictMath.PI) est, ou n'est pas, égal à M_PI dans math.h.
GCC 3.4.4 (Cygwin) math.h contient:
#define M_PI 3.14159265358979323846
^^^^^
mais cette
printf("%.20f", M_PI);
produit
3.14159265358979311600
^^^^^
qui suggère que les 5 derniers chiffres ne peuvent pas faire confiance .
Pendant ce temps, Javadocs dire que java.lang.Math.PI est:
La valeur
double
qui est plus proche que tout autre à pi, le rapport de la circonférence d'un cercle à son diamètre.
et
public static final double PI 3.141592653589793d
ce qui efface les discutables cinq derniers chiffres de la constante.
System.out.printf("%.20f\n", Math.PI);
produit
3.14159265358979300000
^^^^^
Si vous avez une certaine expertise dans les types de données à virgule flottante, pouvez-vous me convaincre que ces constantes de bibliothèque sont exactement égales? Ou qu'ils ne sont certainement pas égaux?
En C, vous pouvez faire double pi = M_PI; printf ("% lld \ n", pi); pour obtenir le même nombre entier 64bit: 4614256656552045848 –
Merci Bruno, qui répond à peu près à la question originale. – JeeBee