Gendal67
Messages postés627Date d'inscriptionmercredi 16 juin 2004StatutMembreDernière intervention24 juillet 2011
-
13 août 2005 à 01:09
Gendal67
Messages postés627Date d'inscriptionmercredi 16 juin 2004StatutMembreDernière intervention24 juillet 2011
-
13 août 2005 à 20:41
Bonsoir,
Je dévellope actuellement des fonctions mathématiques et je crois que j'ai une fonction qui calcule mal...! Je m'explique :
(ULONG)((pow(65, 5))) % 21
Ce calcul me retourne 10...alors que j'ai beau refaire mes calculs à moi, je trouve toujours 11 ! Pourtant lorsque je mets des valeurs genre 1 à 35 par exemple à la place de 65, tout semble correct...
Voici mon calcul perso :
65 = 2 mod 21
65^5 = 32 mod 21 <==> 65^5 = 11 mod 21
J'ai cherché pendant un long moment et je n'ai pas trouvé d'ou pouvait venir l'erreur... le ULONG convertit le pow() pour pouvoir subir l'opérateur modulo; il accepte largement la valeur 65^5 ... donc là je n'ai pas d'explication
vecchio56
Messages postés6535Date d'inscriptionlundi 16 décembre 2002StatutMembreDernière intervention22 août 201014 13 août 2005 à 09:32
De toutes facons pour les entiers c'est idiot à mon avis d'utiliser un fonction faite pour les flottants. On sait que ces nombres sont codés de manière imprécise. Je pense que tu as plutot intérêt à écrire ta routine int ipow(int, int)
toujours obtenu 10... j'ai essayé avec cout en me disant que le %ld était peut-etre source de l'erreur...mais en fait cout m'affiche également 10... je devrais tester comme tu le suggère avec une fonction perso...même si je en comprend toujours pas d'ou peut bien venir le problême...(dev-cpp?)
Gendal67
Messages postés627Date d'inscriptionmercredi 16 juin 2004StatutMembreDernière intervention24 juillet 20112 13 août 2005 à 10:22
Et là avec la fonction perso : ULONG pow(ULONG ldBase, int exposant); tout marche...elle me retourne bien 11...je crois que l'erreur doit etre assez difficile à trouver...
Gendal67
Messages postés627Date d'inscriptionmercredi 16 juin 2004StatutMembreDernière intervention24 juillet 20112 13 août 2005 à 10:50
J'ai parlé trop vite...en fait c'est bizarre...avec ma fonction perso, j'ai bien 11 comme retour mais lorsque je remplace le 65 par 100 je trouve la valeur 17 alors que je m'attend à obtenir 4
Voici mon code :
Pitié que qqun m'éclaire! Tout semble fonctionner avec des valeurs de oct de 0 à environ 80 (je dis bien semble) mais après j'obtiens des résultats érronés...je ne comprend pas
Gendal67
Messages postés627Date d'inscriptionmercredi 16 juin 2004StatutMembreDernière intervention24 juillet 20112 13 août 2005 à 11:04
Désolé vecchio mais je ne capte pas le rapport là... pow retourne un ULONG (donc une plage très étendue) et oct est toujours compris entre 0 et 255 puisque c'est un caractère lu dans le fichier...de + printf utilise bel et bien %ld réservé aux long... pas callé ce que tu as voulu dire...
Gendal67
Messages postés627Date d'inscriptionmercredi 16 juin 2004StatutMembreDernière intervention24 juillet 20112 13 août 2005 à 11:15
euh, ah bon??? ULONG ce n'est pas "unsigned long" par hasard ? Si non, autant pour moi...alors à quoi sert UINT si au final ça couvre les memes plages de valeurs que ULONG
steve_clamage
Messages postés475Date d'inscriptiondimanche 3 octobre 2004StatutMembreDernière intervention11 août 20065 13 août 2005 à 11:22
Faut pas se faire pieger par les noms, c'est pour la portabilité.
int dépend de la machine et long est généralement sur 32 bits (et C99 fournit long long pour 64 bits).
int <long mais en 32bits int 32b et long = 32b donc int = long.
Si tu veux du 64 bits faut voir du cotés des extensions de ton compilo
(généralement __int64), seul C99 fournit le type standard "long long"
et "unsigned long long" (voir dans stdint.h).
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019 13 août 2005 à 19:12
vi mais pas de conversion directe unsigned __int64 vers double par le C (et avec raison) sinon tu pourrais obtenir du double négatif. Faut coder à la main mais pas difficile du tout..
Gendal67
Messages postés627Date d'inscriptionmercredi 16 juin 2004StatutMembreDernière intervention24 juillet 20112 13 août 2005 à 19:18
Merci vraiment à tous pour cet éclairement! N'existe t'il pas d"ja un type qui couvre réelement les plages de valeurs d'un "unsigned long" ou faut il que j'en crée un du type :
typedef unsigned long ULONG,*PULONG;
En fait dans winnt.h, ligne 55..le type ULONG est défini comme cela...donc là je ne comprend pas.. comment déclarer un vrai ULONG ? faut il mettre "ulong" en minuscule ? (j'ai vu cela sur msdn sur un code en C#)