Bonjour,
Jusqu'à quel ordre de nombre le Fortran peut lire en double précision ?
Par exemple, est-ce que le nombre $1*10^(-100)$ peut être accepté ?
Merci
Version imprimable
Bonjour,
Jusqu'à quel ordre de nombre le Fortran peut lire en double précision ?
Par exemple, est-ce que le nombre $1*10^(-100)$ peut être accepté ?
Merci
Salut!
Ce n'est pas une question de Fortran, mais de caractéristiques du processeur, qui sont généralement régies par la norme IEEE 754. Tu trouveras toutes les informations à ce sujet sous ce nom dans Wikipedia.
Jean-Marc Blanc
En plus du processeur, tu dois utiliser la solution des kinds de Fortran 90. Par exemple :
Code:
1
2
3
4
5
6
7 integer, parameter :: Real100 = selected_real_kind(r=100) ... real (kind=Real100) x,y,z ... x = 1e-100_Real100 ...
habituellement, sur un pc 32 bits, les double precision sont codés sur 8octets (64bits) (NB: un réél est codé par son signe, sa mantisse et son exposant) donc t'inquiète, tu peux largement monter dans les exposant, en tout cas, j'ai déjà vu passer des nombres à trois chiffres dans l'exposant sans problèmes...
le truc c'est qu'après tu fleurte avec l'erreur machine et donc tu peux avoir des surprises... (surtout pour les petits nombres)
il se compose génralement:
1bits de signe, 52bits de mantisse enfin 11 pour l'exposant.
dans l'exposant, il y a: 1bit de signe, et 10 pour le nombre soit:
de -1023 à 1024
Remarque, pour les real*4, il y a
1 bit pour le signe, 23 bits pour la mantisse et 8 bits pour l'exposant
soit pour l'exposant: de -127 à 128
donc même avec un real*4 tu peut avoir un 10^100
Non. La plage d'exposant -127:128 doit être appliquée à une base de 2. Et 2^128 donne environ 3.4 x 10 ^ 38. En fait, la plage en base 10 des reals 4 est d'environ 1.175E-38 à 3.402E38. On est donc loin de 10^100...
Pour les real (8), la plage en base 10 est d'environ 2.225e-308 à 1.797e308
Merci pour vos réponses c est un peu plus claire maintenant,
mais si dans le coeur d une subroutine les nombres commencent a dépasser l ordre 10^-351, alors tout va etre detruit meme si la reponses finale de la subroutine n est pas de l ordre 10^-351, alors il n y aura pas de solutions dans ce cas?
merci
Salut!
Il ne suffit pas que le résultat final soit dans le domaine des nombres tolérés par ton processeur; il faut aussi que cette condition soit vérifiée pour tous les résultats intermédiaires. C'est à toi de faire le nécessaire lors de la formulation de ton problème et de la conception de ton programme.
Jean-Marc Blanc
Tout à fait. Pour tester les valeurs en cours de programme, j'utilise la fonction huge
qui renvoie la valeur maximale dans le type concerné. Elle fait partie du standard Fortran95.
Par exemple :
renvoieCode:
1
2
3
4 print *, "Le plus grand entier ", huge (0) print *, "Le plus grand réel ", huge (0.0) print *, "Le plus grand réel en double précision ",huge (0.0d0)
Le plus grand entier 2147483647
Le plus grand réel 3.4028235E+38
Le plus grand réel en double précision 1.797693134862316E+308
quand meme, j utilise le f77...
Certes. Je ne voudrais surtout pas apparaître polémique, indiscret ou désobligeant,
mais je ne comprend pas pourquoi tu ne passes pas au Fortran 90( ou +).
Ce standard offre de nombreuses possibilités qui m'ont manqué pendant les
années où j'utilisais le FORTRAN77 : types dérivés, allocation dynamique, fonctions récursives, .
De plus, -- (j'utilise Linux openSUSE au labo et zenwalk chez moi) il est (va être) de
plus en plus difficile de trouver des compilateurs pour le FORTRAN77.
Pour l'avoir abondamant testée, l'option --ff2c est loin de résoudre tous les problèmes
de compatibilité.
sinon il faut, à l'intérieur de ta subroutine utiliser des reels plus grand que ça...
je sais qu'en C il y a les "extended" donc il doit bien y avoir un moyen de les utiliser en fortran genre
peut-être...Code:real*16