2017-02-25 1 views
1

Je vois une différence entre python et Fortran lors de l'utilisation de la fonction sinus. Quelqu'un pourrait-il nous éclairer là-dessus, s'il vous plaît?Disparité de précision entre Fortran et Python (fonction sin)

en python:

 import math 
     print(math.sin(6.28318530717959)) 
     >> 3.3077843189710302e-15 

dans Fortran90:

 print*, sin(6.28318530717959d0) 
     >> 3.3077720792452914E-15 

EDIT: Comme il semble être un problème de compilateur Fortran, je G95 avec

 g95 -O3 test.f90 -o test.exe 
+1

probablement des bibliothèques mathématiques différentes. –

+0

wolfram alpha donne '3.523074713233440994231605661193961688584318794 × 10^-15' –

+0

Python utilise la bibliothèque mathématique C. C signale également 3.3077843189710302386e-15. Si Wolfram Mathematica est un standard de calculs de haute précision, il rapporte également la même réponse. – DyZ

Répondre

-1

Selon IEEE 754 pour la représentation float:

In [7]: bin(3.3077720792452914e-15.view(np.uint64)) 
Out[7]: '0b11110011101101110010110011010000000000000000000000000000000000' 

montre une mantisse tronquée, lorsque

In [9]: bin(3.3077843189710302e-15.view(np.uint64)) 
Out[9]: '0b11110011101101110010110011101100111001100111010111010001111111' 

montre une plaine.

Probablement un problème de type, avec un float32 dans le processus, même l'origine est mystérieuse.

+1

Depuis Fortran 77, l'argument de double précision promeut automatiquement l'intrinsèque à double, donc sin() et dsin() (compatibilité Fortran 66) doivent être identiques. Je ne connais pas de Fortran dans la dernière décennie où c_double pourrait différer de la double précision, mais techniquement, ce sont des types de données différents même s'ils partagent la même valeur. La question est un peu plus incertaine en passant à c_long_double et à d'autres (et le mode de précision étendue x87, non disponible dans tous les compilateurs). – tim18

+3

Cette réponse est fausse comme mentionné par tim18.SIN est le nom générique de toutes les fonctions du sinus Fortran! La fonction sinusale droite est sélectionnée en fonction du type d'argument. –

+0

Merci. Je corrige la partie erronée de ma réponse. –