Pour des valeurs entieres multiples de 13, TRUNC me renvoie la valeur inférieure.
Ex:
TRUNC(0.65/0.05) = 12
TRUNC(5.2/0.1) = 51
TRUNC(1.3/0.1) = 12
alors que
TRUNC(13) = 13...
superstition???? ou magie
Pour des valeurs entieres multiples de 13, TRUNC me renvoie la valeur inférieure.
Ex:
TRUNC(0.65/0.05) = 12
TRUNC(5.2/0.1) = 51
TRUNC(1.3/0.1) = 12
alors que
TRUNC(13) = 13...
superstition???? ou magie
C'est certainement un problème dû à la division (multiplication) réelle. Tu travaille avec des réels donc le calcul n'est qu'une succession d'arrondis. Le résultat obtenu pour 5.2 / 0.1 est peut-être 5.1999...e1. Donc quand tu tronques, tu retombes sur 51.
Pour bien faire, il faudrait peut-être faire un test sur la valeur obtenue, par exemple :
Donc tu introduis un nombre "limite" que tu considères comme négligeable dans tes calculs et si ton résultat + cette limite dépasse la dizaine alors c'est qu'il y'a eu une erreur d'arrondi. Normalement il devrait être de l'ordre de la précision de la mantisse, ce qui dépend de la plateforme, mais 1e-15 devrait être convenable.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 const limite = 0.001; ... res := 5.2 / 0.1; tronc := TRUNC(res); if TRUNC(res + limite) > tronc then tronc := tronc+1;
sur mon Turbo Pascal 7.01 téléchargé sur DVP, WriteLn(Trunc(5.2 / 0.1)) m'affiche bien 52 à l'écran .... sur quel compilateur travailles-tu ?
Bonjour !
Par contre, Free Pascal 2.0.2 et Virtual Pascal 2.1 renvoient tous deux 51.
Règles du forum
Cours et tutoriels Pascal, Delphi, Lazarus et Assembleur
Avant de poser une question, consultez les FAQ Pascal, Delphi, Lazarus et Assembleur
Mes tutoriels et sources Pascal
Le problème en ce bas monde est que les imbéciles sont sûrs d'eux et fiers comme des coqs de basse cour, alors que les gens intelligents sont emplis de doute. [Bertrand Russell]
La tolérance atteindra un tel niveau que les personnes intelligentes seront interdites de toute réflexion afin de ne pas offenser les imbéciles. [Fiodor Mikhaïlovitch Dostoïevski]
idem Free pascal 1.0.6 ça donne du 12 au lieu de 13 !![]()
je pense que c'est vraiment un bug et même que c'est grave comme problème !
j'ai essayé avec Freepascal de mettre l option compatible avec TP 7.0 mais ça ne change rien : le resultat reste faux !
sinon ce n'est pas trop une fonction que j'utilise (je prefère quand cela est possible) utiliser INT mais quand même ça fait désordre !
Merci de vos réponses,
Le plus étonnant est que cela intervient seulement pour les multiples de 13. Donc le type REAL n y est pour rien ...C'est certainement un problème dû à la division (multiplication) réelle. Tu travaille avec des réels donc le calcul n'est qu'une succession d'arrondis. Le résultat obtenu pour 5.2 / 0.1 est peut-être 5.1999...e1. Donc quand tu tronques, tu retombes sur 51.
Quant à moi, j utilises le compilateur de VAX VMS.
Partager