J'essaie d'utiliser la fonction intrinsèque 'CEILING', mais l'erreur d'arrondi rend difficile l'obtention de ce que je veux parfois. L'exemple de code est juste très simple:Utiliser CEILING sans l'effet d'arrondi Erreur
PROGRAM MAIN
IMPLICIT NONE
INTEGER, PARAMETER :: ppm_kind_double = KIND(1.0D0)
REAL(ppm_kind_double) :: before,after,dx
before = -0.112
dx = 0.008
after = CEILING(before/dx)
WRITE(*,*) before, dx, before/dx, after
END
La valeur que je donne à « avant » et « dx » dans le code est juste pour la démonstration. Pour ceux avant/dx = -13.5 par exemple, je veux utiliser CEILING pour obtenir -13. Mais pour la photo que je montre, je veux vraiment -14. J'ai considéré l'utilisation de certains arguments comme
IF(ABS(NINT(before/dx) - before/dx) < 0.001)
Mais ce n'est tout simplement pas beau. Y a-t-il une meilleure façon de faire cela?
Mise à jour:
Je fus surpris de constater que le problème ne se produira pas si je mets les variables constantes dans ppm_kind_double. Donc je suppose que cette "erreur d'arrondi" ne se produira que lorsque le nombre de chiffres pour la précision d'arrondi de la machine que j'utilise est supérieur à ce qui est défini dans ppm_kind_double. Je cours réellement mon programme (pas ce code de démo) sur un groupe, que je ne sais pas au sujet de la précision de machine. Alors peut-être que c'est la précision quadruple sur cette machine qui mène au problème?
Après avoir défini des constantes à double précision:
before = -0.112_ppm_kind_double
dx = 0.008_ppm_kind_double
Vous m'avez mis un peu de côté en voulant -14. Il m'a fallu un moment pour réaliser que -0.112/0.008 est exactement -14, mais à cause des erreurs d'arrondi, le résultat est légèrement plus, et le "PLAFOND" amplifie alors cette minuscule erreur. – chw21
@ chw21, en fait, j'ai vu votre commentaire précédent et j'attendais que vous le trouviez. :) – Ruizhi
Étant donné que la précision fait partie du problème ici, il convient de noter que vos constantes littérales ne sont que de simple précision - par ex. '-0.112' devrait probablement être écrit' -0.112_ppm_kind_double'. Ce changement ne résoudra cependant pas le problème sous-jacent. – IanH