kaervas
Messages postés51Date d'inscriptionvendredi 25 novembre 2005StatutMembreDernière intervention19 avril 2008
-
26 nov. 2005 à 00:53
bipcpp
Messages postés40Date d'inscriptionmardi 18 mai 2004StatutMembreDernière intervention 2 mai 2010
-
26 nov. 2005 à 20:26
Bonjour a tous,
Mon code, a un moment donne, fait le produit de deux int, j'aimerais faire une gestion d'erreur (soit un simple exit(0)) lorque le resultat de ce produit, que je dois mettre dans un autre int, depasse 2^32.
Le probleme que j'ai est que je ne peux stocker ce produit nulle part pour le comparer a la taille d'un int, puisque aucuns type ne peut le contenir (2milliard x 2milliard par exemple).
J'avais pense au passage d'int en chaine puis de produit de deux chaine, mais mon programme est court a la base, je ne vais pas rajouter une page juste pour gere une erreur!
Mais si quelqu'un a une autre solution...
Merci d'avance (:
vecchio56
Messages postés6535Date d'inscriptionlundi 16 décembre 2002StatutMembreDernière intervention22 août 201014 26 nov. 2005 à 01:09
Si c'est pour les cours, je pense que l'assembleur n'est pas la solution attendue
Si tu as juste a détécter l'erreur, tu peux le faire simplement:
Tu veux vérifier que a*b<2^32, tu vérifies donc que a<2^32/b
kaervas
Messages postés51Date d'inscriptionvendredi 25 novembre 2005StatutMembreDernière intervention19 avril 2008 26 nov. 2005 à 01:01
Merci de ta reponse (rapide).
Je n'ai pas precise mais je ne peux faire ca qu'en C (etudiant..), et sans rajouter de lib specifique a moins de recoder ce qu'il faut..
Je me trompe peutetre mais ce type a l'air d'etre utilise seulement en C++?
Assembleur? Je ne connais pas du tout mais a priori on a le droit vu que le C le prend en charge, je crois, mais je n'y connais rien ...
vecchio56
Messages postés6535Date d'inscriptionlundi 16 décembre 2002StatutMembreDernière intervention22 août 201014 26 nov. 2005 à 01:13
Belle intervention Joky, mais je crois que t'a pas bien compris le problème.
Si tu fais une multiplication qui déborde, ca va donner un résultat, sans doute inférieur à 0xFFFFFFFF
vecchio56
Messages postés6535Date d'inscriptionlundi 16 décembre 2002StatutMembreDernière intervention22 août 201014 26 nov. 2005 à 09:18
Oui, là tu t'es pris la tete pour rien. Plus simplement tu utilises des divisions par 10 et des modulo 10
Excuse moi de te dire ca mais ta solution est horrible ;)
cs_Tidam
Messages postés124Date d'inscriptionjeudi 2 janvier 2003StatutMembreDernière intervention16 février 20062 26 nov. 2005 à 11:17
Perso je ne vois pas pourquoi vous vous cassez la tete ... la
multiplication de deux chiffres de longueur len1 et len2 tient toujours
sur la longueur len1 + len2, donc pour moi il suffirait de chopper la
longueur des deux entiers, comparer la longueur maximale qu'on peut
atteindre avec un unsigned int, si ca tient dans un unsigned, on fait
le calcul en unsigned, que l'on compare a 2^31 et si c'est bon on le
met dans un int ...
Je ne vois pas pourquoi vous voulez faire des tableaux etc...
vecchio56
Messages postés6535Date d'inscriptionlundi 16 décembre 2002StatutMembreDernière intervention22 août 201014 26 nov. 2005 à 11:22
Parce que certains nombres de 'longueur' 10 sont inférieurs à 2^32 et d'autres sont supérieurs, donc l'argument longueur ne suffit pas.
De toute facons, je crois kaervas a déja opté pour la méthode que j'ai donnée plus haut qui est plus simple pour seulement détecter l'erreur
cs_Tidam
Messages postés124Date d'inscriptionjeudi 2 janvier 2003StatutMembreDernière intervention16 février 20062 26 nov. 2005 à 12:24
mais C pour ca que je disais de comparer la longueur maximale a la
longueur d'un unsigned int, car comme ca on est certain d'avoir au moin
tous les cas possible pour le signed int
vecchio56
Messages postés6535Date d'inscriptionlundi 16 décembre 2002StatutMembreDernière intervention22 août 201014 26 nov. 2005 à 13:28
Tu pourrais être plus précis? Je vois pas trop comment tu ferais, sans calculer le résultat:
par exemple 56789*56789 est supérieur 2^32
Mais 12345*12345 est inférieur à 2^32
Ce qu'on veut savoir c'est: est-ce que le résultat de la multiplication est valide. Si tu ne te bases que sur les longueurs, tu aura la même réponse pour les deux exemples précédents, or un des deux seulement provoque une erreur