|
| Calcule haute précision avec les exposants |
| Débuté par Gilles LEVASSEUR, 07 mai 2025 16:10 - 6 réponses |
| |
| | | |
|
| |
Membre enregistré 8 messages |
|
| Posté le 07 mai 2025 - 16:10 |
Bonjour, Je poussais un peu Windev et j'ai trouver la limite de Windev pour le calcule des exposants: 100,000 ^3 Après ce nombre, Windev arrondi la réponse pour ne garder les 15 premier nombres (il ajoute des 0 par la suite)
J'essaie de pousser l'équation de Diophantine, et Windev ne m'aide pas...
Quelqu'un connais une façon d'avoir une réponse qui permet d'améliorer cette limitations?
Merci |
| |
| |
| | | |
|
| | |
| |
Membre enregistré 290 messages |
|
| Posté le 07 mai 2025 - 17:28 |
| |
| |
| | | |
|
| | |
| |
| Posté le 07 mai 2025 - 21:01 |
Fabrice N a écrit :
Bonjour Fabrice,
Il semble que ce soit en mémoire ou à l’exécution des fonction de Puissance et Racine. Des que tu lance la fonction puissance ou Racine, et que tu affiche avec Trace(), ça commence à arrondir à partir de 100,001^3. ex: Trace(Puissance(100001,3)) si tu augmente a 100,002, le chiffre de droite va rester un 0.
Tu me diras si c'est assez clair comme explication.
Merci |
| |
| |
| | | |
|
| | |
| |
Membre enregistré 290 messages |
|
| Posté le 09 mai 2025 - 10:15 |
Bonjour Gilles,
Ton explication est plus claire en effet.
Du coup, j'ai écrit 2 codes "quasi identiques" pour vérifier (un en C et l'autre en WLanguage)
En C :
int i; long double j=10000;
for (i=1; i<=20000; i++) { printf("%.0Lf^3= %.0Lf\n", j+i, powl((j+i),3)); }
En Wlanguage :
i est un numérique(37) j est un numérique(37) = 10000
POUR i=1 À 20000 Trace((j+i)+"^3 = "+((j+i)^3)) FIN
Tout se passe bien jusqu'à 21544^3 (tant qu'on reste à 13 chiffres significatifs) Au dela, Windev perd totalement les pédales :

C'est aberrant !
Pareil si on utilise Puissance(21545,3) On aurait du avoir une ErreurDetectée()=Vrai par ex !
Si quelqu'un à une explication à nous donner, je suis preneur...Message modifié, 09 mai 2025 - 10:22 |
| |
| |
| | | |
|
| | |
| |
Membre enregistré 497 messages |
|
| Posté le 09 mai 2025 - 11:33 |
Bonjour,
Par défaut, d'après la documentation, Puissance() prend des réels en paramètres, et renvoie un réel. Lors de l'appel à Trace(), une conversion implicite est donc réalisée pour avoir un type Réel en sortie de Puissance(), et fait perdre la précision demandée.
Une solution est de forcer le type attendu en sortie pour qu'il n'y ait pas de conversion implicite.
Trace(Puissance(21566,3))
xTest est un numérique(37) = Puissance(21566,3) Trace(xTest)
|
| |
| |
| | | |
|
| | |
| |
Membre enregistré 290 messages |
|
| Posté le 09 mai 2025 - 14:31 |
bchanudet a écrit :
Bonjour,
Par défaut, d'après la documentation, Puissance() prend des réels en paramètres, et renvoie un réel. Lors de l'appel à Trace(), une conversion implicite est donc réalisée pour avoir un type Réel en sortie de Puissance(), et fait perdre la précision demandée.
Une solution est de forcer le type attendu en sortie pour qu'il n'y ait pas de conversion implicite.
Trace(Puissance(21566,3)) // => 10030181749500
xTest est un numérique(37) = Puissance(21566,3) Trace(xTest) // => 10030181749496
Merci.
J'avais bien typé mes variables mais visiblement il ne faut pas faire le calcul directement dans le Trace()
Autrement dit, faut être hyper vigilant lors du débogage |
| |
| |
| | | |
|
| | |
| |
Membre enregistré 8 messages |
|
| Posté le 12 mai 2025 - 22:25 |
bchanudet a écrit :
Bonjour, Par défaut, d'après la documentation, Puissance() prend des réels en paramètres, et renvoie un réel. Lors de l'appel à Trace(), une conversion implicite est donc réalisée pour avoir un type Réel en sortie de Puissance(), et fait perdre la précision demandée. Une solution est de forcer le type attendu en sortie pour qu'il n'y ait pas de conversion implicite. Trace(Puissance(21566,3))
xTest est un numérique(37) = Puissance(21566,3) Trace(xTest)
Merci pour votre aide |
| |
| |
| | | |
|
| | | | |
| | |
|