Fonction pow buguée ??

Gendal67 Messages postés 627 Date d'inscription mercredi 16 juin 2004 Statut Membre Dernière intervention 24 juillet 2011 - 13 août 2005 à 01:09
Gendal67 Messages postés 627 Date d'inscription mercredi 16 juin 2004 Statut Membre Dernière intervention 24 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

Merci de votre aide

Gendal67, Dev-C++ 4.9.9.1, J'adore cppfrance!! :-))

17 réponses

luhtor Messages postés 2023 Date d'inscription mardi 24 septembre 2002 Statut Membre Dernière intervention 28 juillet 2008 6
13 août 2005 à 08:38
Oui étonnant, moi j'ai fais ceci:

cout << (int)powf(65,5) << endl;

cout << (int)pow((double)65,5) << endl;

cout << __cmath_power(65,5) << endl;



Résultat:

1160290688

1160290625

1160290625


les deux dernières solutions sont corrects apparemment. Tu peux aller voir le fichier cmath:

template<typename _Tp> _Tp __cmath_power(_Tp, unsigned int);





Je comprend pas bien.
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
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)
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
13 août 2005 à 09:38
D'ailleurs voila un programme qui explique tout:

#include
using namespace std;

int main()
{
float f = 1160290625.0f;
cout << (int)f; // affiche 1160290688
}

Tu ne peux pas coder 1160290625 dans un float, il faut un double. Voila pourquoi pow donne le bon résultat et pas powf

Et je viens de tester, (unsigned long)((pow(65, 5))) % 21; m'affiche 11, tu es sur de toi Gendal?
0
Gendal67 Messages postés 627 Date d'inscription mercredi 16 juin 2004 Statut Membre Dernière intervention 24 juillet 2011 2
13 août 2005 à 10:10
vecchio56> Je crois l'etre...enfait j'ai essayé :


cout << (ULONG)((pow(65, 5))) % 21;
printf("%ld\n", (unsigned long)((pow(65, 5))) % 21);

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, Dev-C++ 4.9.9.1, J'adore cppfrance!! :-))
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
whikie Messages postés 99 Date d'inscription vendredi 24 juin 2005 Statut Membre Dernière intervention 17 septembre 2005
13 août 2005 à 10:21
salut
non en tout cas pas avec la version 4.9.9.2 de Devcpp
avec
#include <cstdlib>
#include
#include <math.h>


using namespace std;


int main(int argc, char *argv[])
{
cout << (int)powf(65,5) << endl;
cout << (int)pow((double)65,5) << endl;
cout<< (unsigned long)((pow(65, 5))) % 21<<endl;


system("PAUSE");
return EXIT_SUCCESS;
}

j'obtiens
1160290688
1160290625
11

bonne chance
0
Gendal67 Messages postés 627 Date d'inscription mercredi 16 juin 2004 Statut Membre Dernière intervention 24 juillet 2011 2
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...

Merci à tous de m'avoir aider

Gendal67, Dev-C++ 4.9.9.1, J'adore cppfrance!! :-))
0
Gendal67 Messages postés 627 Date d'inscription mercredi 16 juin 2004 Statut Membre Dernière intervention 24 juillet 2011 2
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 :

register int oct;

while( (oct = fgetc(hFileIn)) != EOF) {

printf("OCT : %d\tCode : %ld\n", oct, (this->pow((ULONG) oct, 5)) % 21);
}

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, Dev-C++ 4.9.9.1, J'adore cppfrance!! :-))
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
13 août 2005 à 11:01
C'est bien simple: les int sont codés sur 32 bits, et 100^5 > 2^32-1
Regarde gmp ca pourrait t'aider
0
Gendal67 Messages postés 627 Date d'inscription mercredi 16 juin 2004 Statut Membre Dernière intervention 24 juillet 2011 2
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, Dev-C++ 4.9.9.1, J'adore cppfrance!! :-))
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
13 août 2005 à 11:12
ULONG c'est pas plus grand qu'un unsigned int, c'est sur 32 bits
0
Gendal67 Messages postés 627 Date d'inscription mercredi 16 juin 2004 Statut Membre Dernière intervention 24 juillet 2011 2
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

Gendal67, Dev-C++ 4.9.9.1, J'adore cppfrance!! :-))
0
steve_clamage Messages postés 475 Date d'inscription dimanche 3 octobre 2004 Statut Membre Dernière intervention 11 août 2006 5
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).
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 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..

ciao...
BruNews, MVP VC++
0
Gendal67 Messages postés 627 Date d'inscription mercredi 16 juin 2004 Statut Membre Dernière intervention 24 juillet 2011 2
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#)

Gendal67, Dev-C++ 4.9.9.1, J'adore cppfrance!!
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
13 août 2005 à 19:33
Mais ULONG est vraiment unsigned long ou encore DWORD ou UINT etc... tous 32 bits.
Pourquoi encore le redéfinir ?

ciao...
BruNews, MVP VC++
0
steve_clamage Messages postés 475 Date d'inscription dimanche 3 octobre 2004 Statut Membre Dernière intervention 11 août 2006 5
13 août 2005 à 20:01
Gendal67 > On te l'a expliqué, en 32bits long = int = 32bits.
0
Gendal67 Messages postés 627 Date d'inscription mercredi 16 juin 2004 Statut Membre Dernière intervention 24 juillet 2011 2
13 août 2005 à 20:41
Oui désolé, j'avais mal compris....j'ai réussi je crois maintenant, j'ai mis

typedef __int64 INT64;

et j'ai déclaré toutes mes valeurs ULONG en INT64
Merci encore à tous de votre aide

Gendal67, Dev-C++ 4.9.9.1, J'adore cppfrance!! :-))
0
Rejoignez-nous