phyelec a écrit:@Black Jack, merci pour votre retour,je vous crois,pas de souci, faut que je trouve pourquoi mon programme est faux ( le round sans doute ou le sqrt,...à creuser).
Bonjour,
On ne le dit jamais assez (et c'est une erreur très fréquence faite par ceux qui écrivent des programmes informatiques), mais comparer, pour égalité stricte, le résultat d'un calcul et un nombre ne devrait
jamais être fait en informatique.
Les calculs dans un logiciel se font avec un nombre de chiffres significatifs qui n'est pas infini et donc le résultat d'un calcul qui est dans la mémoire de l'ordi est forcément approximatif.
Dans ton exercice par exemple :
n = 132949
donne comme calcul exact : 2n^4+1 = 624842118071940866403
et sa racine carrée = 24996842162,000000643261252593095...
Supposons que ton logiciel travaille avec 16 chiffres significatifs, alors il met dans sa mémoire la valeur 24996842162,00000 (et il "oublie" les décimales qui suivent)
et si on compare avec la valeur entière ... la comparaison dira qu'est bon, alors que c'est faux.
*****
Ne pas penser que ce genre d'erreur n'existent qu'avec des comparaisons avec des racines carrées, c'est vrai pour toutes sortes de calcul.
Par exemple, si on entre sin(1), on a sin(1) = 0,0174524064372835128194189785163... mais l'ordi (si il travaille avec 16 chiffres significatifs) retiendra la valeur : 0,017452406437283
(peut être en arrondissant le dernier chiffre, dans ce cas, il "retiendra" : 0,017452406437284 ... qui n'est pas la valeur exacte. (enfin ce sera un poil moins faux car il retiendra une mantisse et un exposant, qui ici augmenterait la précison d'un chiffre significatif ... mais resterait néanmoins faux)
Et toute comparaison d'égalité avec une valeur plus précise donnera un résultat faux.
Pareil pour des cas encore plus simples, par exemple, on entre 3/17 qui vaut 0,17647058823529411764705882352941...
Mais l'ordi (si il travaille avec 16 chiffres significatifs) retiendra la valeur 0,176470588235294 ... qui n'est pas la valeur exacte.
Et toute comparaison d'égalité avec une valeur plus précise donnera un résultat faux.