Page 1 sur 1

Probleme de calcule ou bug ?

Posté : sam. 01 sept. 2018 10:41
par Ghost911
Bonjour je viens de reprendre autoit cela fais longtemps que j'ai plus pratiquer $math ne renvoie pas le bon résultat je sais pas si c'est moi ou si c'est autoit merci de votre aide normalement 6-4=2 autoit me renvoie 6 donc je comprend pas !

Code : Tout sélectionner

$Num="89304402523905652748447801781"
$result=Mod($Num,97)
$recup=StringSplit ($result,"")
$math=Number ($recup [1]&"-"&$recup [2])
$key=Number ($result&"+"&$math)
MsgBox (0,"",$result)
MsgBox (0,"",$key)
MsgBox (0,"",$math)

Re: Probleme de calcule

Posté : sam. 01 sept. 2018 11:24
par Ghost911
bug ou manque de compréhension de ma part ?

Re: Probleme de calcule ou bug ?

Posté : sam. 01 sept. 2018 14:32
par jchd
Il y a plusieurs erreurs dans ce code.

Déjà, la valeur maximale d'un entier positif (63 bits) est :
ConsoleWrite(0x7fffffffffffffff & @LF) ; 9223372036854775807 Max Int64
Donc la valeur pour laquelle il s'agit de trouver la clé est bien trop grande pour ce type d'approche.

Une seule solution : l'UDF BigNum.au3. Exemple de code (algo de base peut-être faux) :

Code : Tout sélectionner

#include "..\include\BigNum.au3"

Local $sNum = "89304402523905652748447801781"
Local $iResult = Int(_BigNum_Mod($sNum, "97"))
Local $iMath = Int($iResult / 10) - Mod($iResult, 10)
Local $iKey = $iResult + $iMath
MsgBox(0, "", $iResult)
MsgBox(0, "", $iMath)
MsgBox(0, "", $iKey)
De ce fait le reste du code ne convient plus, mais il ne convenait déjà pas.
$math = Number($recup[1] & "-" & $recup[2]) évaluait Number("6" & "-" & "4"), soit Number("6-4"), qui vaut 6.
Il aurait suffit de :
$math = $recup[1] - $recup[2]
Idem pour la ligne en-dessous.

Autre problème : je pense que l'algorithme est incorrect car si (comme avec le nombre fourni) le modulus est < 10 (ici il vaut 3) ou s'il est de la forme XY avec Y > X on obtient une valeur négative.
Je ne sais pas quelle est cette version de check-digit Mod 97 mais perso je vérifierais à deux fois l'origine de l'algo.