PC SOFT

FORUMS PROFESSIONNELS
WINDEVWEBDEV et WINDEV Mobile

Accueil → WINDEV 2025 → Calcule haute précision avec les exposants
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
Bonjour,

Les réels sont effectivement limités à 15 chiffres significatifs

Au delà et jusqu'à 38 chiffres significatifs maxi, il faut utiliser le type "numérique"
https://doc.pcsoft.fr/fr-FR/?1514072&name=numerique_type_variable

Cdt
Posté le 07 mai 2025 - 21:01
Fabrice N a écrit :
Bonjour,

Les réels sont effectivement limités à 15 chiffres significatifs

Au delà et jusqu'à 38 chiffres significatifs maxi, il faut utiliser le type "numérique"
https://doc.pcsoft.fr/fr-FR/?1514072&name=numerique_type_variable

Cdt


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))
// => 10030181749500

xTest est un numérique(37) = Puissance(21566,3)
Trace(xTest)
// => 10030181749496
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))
// => 10030181749500

xTest est un numérique(37) = Puissance(21566,3)
Trace(xTest)
// => 10030181749496


Merci pour votre aide