C++Talk.NET Forum Index C++Talk.NET
C++ language newsgroups
 
Archives   FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

entier par défaut = mauvais résultat
Goto page 1, 2  Next
 
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (French)
View previous topic :: View next topic  
Author Message
PurL
Guest





PostPosted: Tue Feb 01, 2005 8:32 am    Post subject: entier par défaut = mauvais résultat Reply with quote



Salut,

Je sais que par défaut, quand le compilateur (à l'exécution) à besoin de
variables intermédiaires pour effectuer une ligne de calcul, celles-ci sont
de type int. Ce qui parfois (meme tres souvent quand il s'agit de divisions)
introduit de mauvais résultats. Comment faire pour forcer le compilateur
SANS modifier le code (par option de compilation ou autre) à trouver le bon
resultat ?

Ex :

float a = 5 / 3; //a vaut 1 alors qu'il devrait valoir 1.6667

Astuces pour obtenir le bon résultat :

float a = (float)5 / 3;

ou encore :

float a = 5.0 / 3;

Mais pour un utilisateur lambda, quand il rentre 5 / 3 et qui voit un
resultat de 1, il fait un bond sur sa chaise Smile)
Et je vais pas lui dire qu'il faut mettre 5.0 pour que ca marche Smile (les
utilisateurs finaux ne sont pas informaticiens)

Comment faire pour que 5 / 3 soit égale à 1.6667 ?

Merci pour votre aide,

PurL


Back to top
Jean-Marc Bourguet
Guest





PostPosted: Tue Feb 01, 2005 8:44 am    Post subject: Re: entier par défaut = mauvais résultat Reply with quote



"PurL" <purl-nospam (AT) chez (DOT) com> writes:

Quote:
Salut,

Je sais que par défaut, quand le compilateur (à l'exécution) à besoin de
variables intermédiaires pour effectuer une ligne de calcul, celles-ci sont
de type int.

Drole de vision des choses: le type du resultat d'un calcul depend des
arguments.

Quote:
Ce qui parfois (meme tres souvent quand il s'agit de divisions)
introduit de mauvais résultats. Comment faire pour forcer le
compilateur SANS modifier le code (par option de compilation ou
autre) à trouver le bon resultat ?

Rien de standard et je n'ai jamais rien vu dans le genre. Changer de
langage?

Quote:
Ex :

float a = 5 / 3; //a vaut 1 alors qu'il devrait valoir 1.6667

Les arguments de / sont des entiers donc le resultat est entier.

Quote:
Mais pour un utilisateur lambda, quand il rentre 5 / 3 et qui voit
un resultat de 1, il fait un bond sur sa chaise Smile) Et je vais pas
lui dire qu'il faut mettre 5.0 pour que ca marche Smile (les
utilisateurs finaux ne sont pas informaticiens)

Je ne vois pas pourquoi tu laisses des utilisateurs finaux non
programmeurs faire des choses sans les verifier. Faudrait donner un
peu plus de contexte pour qu'on puisse te proposer des solutions.

A+

--
Jean-Marc
FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ
C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html
Site de usenet-fr: http://www.usenet-fr.news.eu.org

Back to top
PurL
Guest





PostPosted: Tue Feb 01, 2005 9:17 am    Post subject: Re: entier par défaut = mauvais résultat Reply with quote



Quote:
Drole de vision des choses: le type du resultat d'un calcul depend des
arguments.

Je crois pas nan...

Quote:
Ex :

float a = 5 / 3; //a vaut 1 alors qu'il devrait valoir 1.6667

Les arguments de / sont des entiers donc le resultat est entier.

Non, les arguments de / ne sont pas QUE des int, y'a des surchages !
Sinon comment veux-tu que 5.0 / 3 fonctionne...

Quote:
Je ne vois pas pourquoi tu laisses des utilisateurs finaux non
programmeurs faire des choses sans les verifier. Faudrait donner un
peu plus de contexte pour qu'on puisse te proposer des solutions.

Je pense etre clair !
Je veux que a vaux 1.6667 quand je fais : float a = 5 / 3;

Il faudrait peut-etre surcharger personnellement le / et lui dire (au
compilateur) de n'appeler que le mien et pas les siens, comment faire cela ?

PurL



Back to top
Jean-Marc Bourguet
Guest





PostPosted: Tue Feb 01, 2005 9:27 am    Post subject: Re: entier par défaut = mauvais résultat Reply with quote

"PurL" <purl-nospam (AT) chez (DOT) com> writes:

Quote:
Drole de vision des choses: le type du resultat d'un calcul depend des
arguments.

Je crois pas nan...

Ex :

float a = 5 / 3; //a vaut 1 alors qu'il devrait valoir 1.6667

Les arguments de / sont des entiers donc le resultat est entier.

Non, les arguments de / ne sont pas QUE des int,

Desole, 5 et 3 sont des entiers.

Quote:
y'a des surchages !

Il y a des surcharges sur /, pas sur les literaux. La surcharge de /
choisie depend des types des arguments, ici deux entiers.

Quote:
Sinon comment veux-tu que 5.0 / 3 fonctionne...

5.0 est un double. Il n'y a pas de surcharge de / avec un double et
un int, donc le int est converti d'abords implicitement en double. Le
resultat est un double, converti par apres implicitement en float si
tu fais

float a = 5.0/3;

Quote:
Je ne vois pas pourquoi tu laisses des utilisateurs finaux non
programmeurs faire des choses sans les verifier. Faudrait donner
un peu plus de contexte pour qu'on puisse te proposer des
solutions.

Je pense etre clair !
Je veux que a vaux 1.6667 quand je fais : float a = 5 / 3;

Pourquoi veux-tu qu'un "un utilisateur lambda non informaticien" entre
du code que tu ne verifies meme pas?

Quote:
Il faudrait peut-etre surcharger personnellement le / et lui dire
(au compilateur) de n'appeler que le mien et pas les siens, comment
faire cela ?

Les seules surcharges que tu peux definir doivent avoir au moins un
parametres n'etant pas un type de base.

A+
--
Jean-Marc
FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ
C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html
Site de usenet-fr: http://www.usenet-fr.news.eu.org

Back to top
Falk Tannhäuser
Guest





PostPosted: Tue Feb 01, 2005 10:09 am    Post subject: Re: entier par défaut = mauvais résultat Reply with quote

PurL wrote:
Quote:
Je sais que par défaut, quand le compilateur (à l'exécution) à besoin de
variables intermédiaires pour effectuer une ligne de calcul, celles-ci sont
de type int. Ce qui parfois (meme tres souvent quand il s'agit de divisions)
introduit de mauvais résultats. Comment faire pour forcer le compilateur
SANS modifier le code (par option de compilation ou autre) à trouver le bon
resultat ?

Ex :

float a = 5 / 3; //a vaut 1 alors qu'il devrait valoir 1.6667

Facile:

#include <string>
#include <fstream>
#include <iostream>
#include <cstdlib>
#include <cassert>
#include <cstdio>

double call_awk(std::string const& expr)
{
static char const tmpfilename[] = "/tmp/callawk.tmp";
std::string cmd_line = std::string("awk 'BEGIN {print ") + expr +"}' > " + tmpfilename;
int system_rslt = std::system(cmd_line.c_str());
assert(system_rslt == 0);
std::ifstream in(tmpfilename);
assert(tmpfilename);
double result; in >> result;
assert(in || in.eof());
std::remove(tmpfilename);
return result;
}

#define PURL_EXPRESSION(expr) call_awk(#expr)

int main()
{
double d = PURL_EXPRESSION( 5 / 3 );
std::cout << d << 'n';
return 0;
}

SNCR, Falk

Back to top
Frederic Py
Guest





PostPosted: Tue Feb 01, 2005 10:25 am    Post subject: Re: entier par défaut = mauvais résul tat Reply with quote

On 2005-02-01 11:09:20 +0100, =?ISO-8859-1?Q?Falk_Tannh=E4user?=
<falk.tannhauser (AT) crf (DOT) canon.fr> said:
[...]
Quote:
Facile:

#include <string
#include #include #include #include #include
double call_awk(std::string const& expr)
{
static char const tmpfilename[] = "/tmp/callawk.tmp";
std::string cmd_line = std::string("awk 'BEGIN {print ") + expr +
"}' > " + tmpfilename;
int system_rslt = std::system(cmd_line.c_str());
assert(system_rslt == 0);
std::ifstream in(tmpfilename);
assert(tmpfilename);
double result; in >> result;
assert(in || in.eof());
std::remove(tmpfilename);
return result;
}

Explique moi comment tu obtient quelque chose d'autre qu'un message
d'erreur avec un os ou awk n'est pas installé ou pas dans le PATH ? (au
hasard windows ou un linux avec un user qui a fait n'importe quoi de sa
variable PATH)

De même comment va t'on faire la différence entre une erreur de syntaxe
awk, une erreur de calcul, une erreur d'appel ou autre chose ?

Bref avant de faire appel a la fonction system il faut regarder ce
qu'il en coute et si one ne risque pas de sortir un char d'assault (awk
est pas mal dans son genre) pout cueillir une paquerette (une division
avec resultat flottant c'est quand même pas dur à faire)

Quote:

#define PURL_EXPRESSION(expr) call_awk(#expr)

int main()
{
double d = PURL_EXPRESSION( 5 / 3 );
std::cout << d << 'n';
return 0;
}

SNCR, Falk


--
Fred


Back to top
Matthieu Moy
Guest





PostPosted: Tue Feb 01, 2005 10:30 am    Post subject: Re: entier par défaut = mauvais résultat Reply with quote

Frederic Py <fredpy (AT) SPAM (DOT) free.fr> writes:

Quote:
Bref avant de faire appel a la fonction system il faut regarder ce
qu'il en coute

Avant de se lancer dans le troll, il faut regarder ce qu'il en coute
aussi Wink Je crois qu'il y avait un peu d'ironie dans le message
auquel tu réponds ...

--
Matthieu

Back to top
PurL
Guest





PostPosted: Tue Feb 01, 2005 11:00 am    Post subject: Re: entier par défaut = mauvais résultat Reply with quote

Quote:
Desole, 5 et 3 sont des entiers.

C'est ce que je dis, par défaut le compilateur s'il peut mettre en int il le
fait.
Mais dans "float a = 5;", a est un float et est egal à 5, donc 5 est bien
codé sous le format d'un float et non d'un int.

Quote:
Sinon comment veux-tu que 5.0 / 3 fonctionne...

5.0 est un double. Il n'y a pas de surcharge de / avec un double et
un int, donc le int est converti d'abords implicitement en double. Le
resultat est un double, converti par apres implicitement en float si
tu fais

float a = 5.0/3;


Je comprend tout ça.
Ce que je trouve bizzare, c'est que "qqch" (le compilateur ?) devrait voir
qu'il faut transformer 5 et 3 en double pour avoir un resultat correct.
Comment forcer l'apel avec les arguments de type double meme si le
compilateur veut utilisé celui avec les int ?

Quote:
Je pense etre clair !
Je veux que a vaux 1.6667 quand je fais : float a = 5 / 3;

Pourquoi veux-tu qu'un "un utilisateur lambda non informaticien" entre
du code que tu ne verifies meme pas?

L'appli finale permet à l'utilisateur de faire du calcul supplémentaire sur
des données.
L'utilisateur écrit son code en C++ (en général, ca se limite à des calculs
mathématiques et l'utilisation de if, for, ...)
Par analogie, Excel utilise VB pour faire ces macro, mon appli utilise le C
pour que l'utilisateur manipule ses données.
Tout le code tapé par l'utilisateur est mis dans un .CPP pour former une DLL
appelée par l'appli principale.
Et quand il tape return 5 / 3 (dans une fonction qui retourne un float); il
aimerait avoir 1.6667 et non pas 1, et je le comprends.
Dans le meme style voir que le resultat de "5 / 3 * 2.5" est différent de
2.5 * 5 / 3" est quelque peu déroutant.

Quote:
Les seules surcharges que tu peux definir doivent avoir au moins un
parametres n'etant pas un type de base.

A+

Pas d'autres solutions ?
Je vais pas changer de langage pour si peu...

PurL



Back to top
Serge Paccalin
Guest





PostPosted: Tue Feb 01, 2005 11:18 am    Post subject: Re: entier par défaut = mauvais résultat Reply with quote

Le mardi 1er février 2005 à 12:00, PurL a écrit dans fr.comp.lang.c++ :

Quote:
Ce que je trouve bizzare, c'est que "qqch" (le compilateur ?) devrait voir
qu'il faut transformer 5 et 3 en double pour avoir un resultat correct.

Tu confonds « résultat correct » avec « résultat que *JE* veux ». Ce
sont deux choses différentes. 5 / 3 -> 1 *EST* un résultat correct,
puisque c'est celui que demande la norme.

--
___________ 2005-02-01 12:16:21
_/ _ _`_`_`_) Serge PACCALIN -- sp ad mailclub.net
_L_) Il faut donc que les hommes commencent
-'(__) par n'être pas fanatiques pour mériter
_/___(_) la tolérance. -- Voltaire, 1763

Back to top
Matthieu Moy
Guest





PostPosted: Tue Feb 01, 2005 11:40 am    Post subject: Re: entier par défaut = mauvais résultat Reply with quote

"PurL" <purl-nospam (AT) chez (DOT) com> writes:

Quote:
Mais dans "float a = 5;", a est un float et est egal à 5,

Pas vraiment.

Quote:
donc 5 est bien codé sous le format d'un float et non d'un int.

Pas du tout. 5 est un littéral, entier, c'est le "=" qui fait la
conversion.

Quote:
Pas d'autres solutions ?

A mon avis, le vrai problème est que tu veuilles écrire "5 / 3" dans
tes programmes. Un programme bien écrit ne doit pas utiliser de
constantes litterales au milieu du code. Tu aurais écrit

const float constante1 = 5; // trouver un meilleur nommage !
const float constante2 = 3;

....

float a = constante1 / constante2;

Tu ne te serais même pas posé la question ...

--
Matthieu

Back to top
Frederic Py
Guest





PostPosted: Tue Feb 01, 2005 12:07 pm    Post subject: Re: entier par défaut = mauvais résultat Reply with quote

On 2005-02-01 11:30:19 +0100, Matthieu Moy
<MatthieuNOSPAM.Moy (AT) imag (DOT) fr.invalid> said:

Quote:
Frederic Py <fredpy (AT) SPAM (DOT) free.fr> writes:

Bref avant de faire appel a la fonction system il faut regarder ce
qu'il en coute

Avant de se lancer dans le troll, il faut regarder ce qu'il en coute
aussi Wink Je crois qu'il y avait un peu d'ironie dans le message
auquel tu réponds ...

A la relecture en effet j'ai vu que ca pouvait être ca ... comme quoi
la rédaction de thèse a des effets nuisible sur le sens du 2nd degré :)

--
Fred


Back to top
Jean-Marc Bourguet
Guest





PostPosted: Tue Feb 01, 2005 12:12 pm    Post subject: Re: entier par défaut = mauvais résultat Reply with quote

"PurL" <purl-nospam (AT) chez (DOT) com> writes:

Quote:
Desole, 5 et 3 sont des entiers.

C'est ce que je dis, par défaut le compilateur s'il peut mettre en int il le
fait.
Mais dans "float a = 5;", a est un float et est egal à 5, donc 5 est bien
codé sous le format d'un float et non d'un int.

5 est un int qui est converti en float.

Quote:
Sinon comment veux-tu que 5.0 / 3 fonctionne...

5.0 est un double. Il n'y a pas de surcharge de / avec un double et
un int, donc le int est converti d'abords implicitement en double. Le
resultat est un double, converti par apres implicitement en float si
tu fais

float a = 5.0/3;


Je comprend tout ça.
Ce que je trouve bizzare, c'est que "qqch" (le compilateur ?) devrait voir
qu'il faut transformer 5 et 3 en double pour avoir un resultat
correct.

Tout depend de ce que tu appelles resultat correct. Comme je l'ai
ecrit, les regles de resolution de surcharge ne prennent pas en compte
le contexte dans lequel apparait une expression. Et je ne veux pas
essayer de voir ce que ca donnerait la surcharge sur le resultat avec
les conversions implicites.

Quote:
Comment forcer l'apel avec les arguments de type double meme si le
compilateur veut utilisé celui avec les int ?

Tu connais la reponse, tu l'as donnee.

Quote:
Je pense etre clair !
Je veux que a vaux 1.6667 quand je fais : float a = 5 / 3;

Pourquoi veux-tu qu'un "un utilisateur lambda non informaticien" entre
du code que tu ne verifies meme pas?

L'appli finale permet à l'utilisateur de faire du calcul supplémentaire sur
des données.
L'utilisateur écrit son code en C++ (en général, ca se limite à des calculs
mathématiques et l'utilisation de if, for, ...)
Par analogie, Excel utilise VB pour faire ces macro, mon appli utilise le C
pour que l'utilisateur manipule ses données.
Tout le code tapé par l'utilisateur est mis dans un .CPP pour former une DLL
appelée par l'appli principale.
Et quand il tape return 5 / 3 (dans une fonction qui retourne un float); il
aimerait avoir 1.6667 et non pas 1, et je le comprends.
Dans le meme style voir que le resultat de "5 / 3 * 2.5" est différent de
2.5 * 5 / 3" est quelque peu déroutant.

Soit tu definis ton langage que tu compiles (vers du C++ si tu veux)
ou tu interpretes (auquel cas reutiliser qqch comme TCL/Python/... est
aussi une option), soit tu vis avec.

A+

--
Jean-Marc
FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ
C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html
Site de usenet-fr: http://www.usenet-fr.news.eu.org

Back to top
Pierre Maurette
Guest





PostPosted: Tue Feb 01, 2005 12:27 pm    Post subject: Re: entier par défaut = mauvais résultat Reply with quote

PurL a écrit :
Quote:
Salut,

Je sais que par défaut, quand le compilateur (à l'exécution) à besoin de
variables intermédiaires pour effectuer une ligne de calcul, celles-ci sont
de type int. Ce qui parfois (meme tres souvent quand il s'agit de divisions)
introduit de mauvais résultats. Comment faire pour forcer le compilateur
SANS modifier le code (par option de compilation ou autre) à trouver le bon
resultat ?

Ex :

float a = 5 / 3; //a vaut 1 alors qu'il devrait valoir 1.6667

Astuces pour obtenir le bon résultat :

float a = (float)5 / 3;

ou encore :

float a = 5.0 / 3;

Mais pour un utilisateur lambda, quand il rentre 5 / 3 et qui voit un
resultat de 1, il fait un bond sur sa chaise Smile)
Et je vais pas lui dire qu'il faut mettre 5.0 pour que ca marche Smile (les
utilisateurs finaux ne sont pas informaticiens)

Comment faire pour que 5 / 3 soit égale à 1.6667 ?
- Choisir un autre langage que C++ non traité pour un langage macro

ciblant des utilsateurs lambda qui ne connaissent pas C++ (le C
suffirait également).
- Analyser le texte de la macro, et en profiter pour signaler les
erreurs avant de compiler la DLL.

Le problème précis de float a = 5/3; : à mon avis ce n'est pas les
transtypages de C++ qui sont critiquables, mais l'opérateur /, ou plutôt
l'absence d'opérateur de division euclidienne. Mais comme pour beaucoup
de points de détail de C et de C++, c'est comme ça, c'est paraît-il ce
qui en fait le charme.
Notez que ce problème est également le votre. Donc pourquoi ne pas
l'aborder dans la documentation de votre appli, signalant que les
résutats de / peuvent paraître étranges, expliquant la différence entre
divisions réelle et euclidienne, et proposant l'utilisation de IDIV et FDIV:

inline float FDIV(float a, float b)
{
return a / b;
}

inline int IDIV(int a, int b)
{
return a / b;
}

FDIV(5, 3) donne bien 1.6667. Une seule fonction surchargée ne
conviendrais pas. D'une part, lambda ne sait pas caster pour résoudre
les ambiguïtés, d'unautre coté, ça vous oblige à faire des paris sur les
souhaits de lambda. Pour lui, float f = 3; int i = 3; et la constante 3,
c'est pareil. C'est pour cette même raison que l'idée d'une classe (un
type numérique) est sans doute illusoire.
--
Pierre

Back to top
Alain Naigeon
Guest





PostPosted: Tue Feb 01, 2005 1:50 pm    Post subject: Re: entier par défaut = mauvais résultat Reply with quote

"Jean-Marc Bourguet" <jm (AT) bourguet (DOT) org> a écrit dans le message news:
[email]pxb651cis9p.fsf (AT) news (DOT) bourguet.org[/email]...
Quote:
"PurL" <purl-nospam (AT) chez (DOT) com> writes:

Mais pour un utilisateur lambda, quand il rentre 5 / 3 et qui voit
un resultat de 1, il fait un bond sur sa chaise Smile)

AMHA c'est plutôt une question pour fr.ameublement Wink
Parce que moi, quand je me demande combien de fois
je peux loger 3 dans 5, ben... j'arrive à une seule fois, donc
la valeur de ce qu'on appelle communément le quotient.

Quote:
Et je vais pas
lui dire qu'il faut mettre 5.0 pour que ca marche Smile (les
utilisateurs finaux ne sont pas informaticiens)

La réponse figurait dans ta question, pour éviter de leur
demander cette conversion, tu l'écris toi-même en aval
de ce qu'ils entrent. Et comme disait Jean-Marc, ça te
donne l'occasion de vérifier aussi qu'ils n'ont pas entré
le prénom de leur grand-mère (la norme ne garantissant
pas qu'une conversion en float donne son âge) :-)

--

Français *==> "Musique renaissance" <==* English
midi - facsimiles - ligatures - mensuration
http://anaigeon.free.fr | http://www.medieval.org/emfaq/anaigeon/
Alain Naigeon - [email]anaigeon (AT) free (DOT) fr[/email] - Strasbourg, France



Back to top
adebaene@club-internet.fr
Guest





PostPosted: Tue Feb 01, 2005 2:14 pm    Post subject: Re: entier par défaut = mauvais résultat Reply with quote


PurL wrote:

Quote:
Et quand il tape return 5 / 3 (dans une fonction qui retourne un
float); il
aimerait avoir 1.6667 et non pas 1, et je le comprends.
En supposant que le langage fasse ce que tu voudrais, comment tu ferais

pour récupérer le quotient d'une division?

Arnaud


Back to top
Display posts from previous:   
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (French) All times are GMT
Goto page 1, 2  Next
Page 1 of 2

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2006 phpBB Group
SEO toolkit © 2004-2006 webmedic.