Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

[newbie] Problème printf avec float

16 réponses
Avatar
Florent GABRIEL
Bonjour,

Un programme valant mieux que milles palabres :-)
/* -------- CODE ----------- */
#include <stdio.h>
#include <iostream.h>

struct Data
{
long long ll;
float f1;
float f2;
};

int main( )
{
Data d;
d.ll = 5;
d.f1 = 12.5;
d.f2 = 32.7;

printf("Avec printf : %i - %f , %f\n",d.ll,d.f1,d.f2);
std::cout << "Avec cout : " << d.ll << " - " << d.f1 << " , " << d.f2
<< std::endl;
return 0;
}
/* -------END CODE --------- */


Je récupére en sortie :
Avec printf : 5 - 0.000000 , -0.000000
Avec cout : 5 - 12.5 , 32.7

Pourquoi mon printf ne fonctionne pas ?

Merci d'avance.
TSalm

--
Utilisant le client e-mail révolutionnaire d'Opera :
http://www.opera.com/mail/

6 réponses

1 2
Avatar
Benoit Izac
Bonjour,

le 20/09/2009 à 12:06, Pierre Maurette a écrit dans le message
:

Ce qui est étrange, c'est que tes « "%f", 12.5 » marche une fois sur
deux...



C'est le long long qui fout éventuellement le bordel. Quand il est en
dernière position, ce qui est avant n'est pas affecté. Quand il est en
première position, le code du main() envoit à la suite (dans la pile
par exemple) un long long puis un double (transformé depuis un float)
puis un autre double. Le code du printf() lit soit la même chose avec
%lli, et tout va bien, soit avec %i un int à l'adresse du long long
soit sur ma machine (taille des types et boutisme donné) 0x00000007,
morceau de 0x0000000500000007. Et il lit les double à la suite.
Ceux-ci font 8 octets. On lit donc à une adresse décalée de 4 octets.
Le fait que ça donnera "souvent" 0.0 s'explique par le format des
flottants.
Si l'entier est en dernière position, sa valeur en sera affectée, mais
pas celle des données qui précèdent.

Tout ceci est courant mais totalement dépendant de la plateforme,
format des données, boutisme, conventions d'appel. Donc la norme ne
permet pas de prévoir ce comportement.



Merci, c'est très clair. Je viens de tester sur un i686 et j'ai
effectivement ce problème (qui n'apparaissait pas sur un x86_64).

--
Benoit Izac
Avatar
candide
Pierre Maurette a écrit :

Tout ceci est courant mais totalement dépendant de la plateforme, format
des données, boutisme, conventions d'appel.




ce qui réduit d'autant l'intérêt de la laborieuse démonstration que tu
as tentée de nous faire.


Donc la norme ne permet pas
de prévoir ce comportement.





Ta conclusion est ambiguë, on se demande même si tu n'es pas en train de
confondre "défini par l'implémentation", "déterminé par
l'implémentation" et "comportement indéterminé". Pour quelqu'un qui se
pique de pédagogie, tu as quand même oublié de nous dire l'essentiel :


"If a conversion specification is invalid, the behavior is undefined."

Le seul mérite de ton code (avec les réserves que j'avais indiquées) est
d'en donner une illustration. Tout le reste n'est que glose.
Avatar
-ed-
On 20 sep, 11:58, Benoit Izac wrote:
>> PS : Si tu pouvais réduire la longueur de tes lignes de manière à ce
>> qu'elles fassent au maximum 76 caractères, ce serait plus facile de
>> te lire et de te répondre.

> Volontiers. En fouillant dans les options de Thunderbird (*), il
> apparait que je suis réglé sur 80 caractères, je modifie donc en 76
> mais je ne suis pas sûr que cela résolve le problème.

C'est parfait ; 72 serait encore mieux car ça permet de faire au moins
deux réponses sans avoir à reformatter.



On a pas tous ces problèmes avec Google groupes... Un simple
navigateur suffit... Il y a des années que je n'utilise plus de client
mail ni news...
Avatar
-ed-
On 20 sep, 13:57, candide wrote:

Ta conclusion est ambiguë, on se demande même si tu n'es pas en train de
confondre "défini par l'implémentation", "déterminé par
l'implémentation" et "comportement indéterminé". Pour quelqu'un qui se
pique de pédagogie, tu as quand même oublié de nous dire l'essentie l :

"If a conversion specification is invalid, the behavior is undefined."

Le seul mérite de ton code (avec les réserves que j'avais indiquées ) est
d'en donner une illustration. Tout le reste n'est que glose.



Hé hé, Candide a trouvé une nouvelle victime, ça va me permettre de
prendre des vacances !
Avatar
Patrick Texier
Le Mon, 21 Sep 2009 00:29:32 -0700 (PDT), -ed- a écrit :

On a pas tous ces problèmes avec Google groupes... Un simple
navigateur suffit... Il y a des années que je n'utilise plus de client
mail ni news...



Pitié, ne conseillez pas cette horreur qui envoie :

Content-Transfer-Encoding: quoted-printable



Sur fr.*, c'est interdit. Outlook Express est en plus incapable de le
citer et cela rend certains échanges illisibles.
--
Patrick Texier

vim:syntax=mail:ai:ts=4:et:twr
Avatar
Benoit Izac
Bonjour,

le 21/09/2009 à 09:29, -ed- a écrit dans
le message
:

>> PS : Si tu pouvais réduire la longueur de tes lignes de manière
>> à ce qu'elles fassent au maximum 76 caractères, ce serait plus
>> facile de te lire et de te répondre.

> Volontiers. En fouillant dans les options de Thunderbird (*), il
> apparait que je suis réglé sur 80 caractères, je modifie donc en 76
> mais je ne suis pas sûr que cela résolve le problème.

C'est parfait ; 72 serait encore mieux car ça permet de faire au
moins deux réponses sans avoir à reformatter.



On a pas tous ces problèmes avec Google groupes... Un simple
navigateur suffit... Il y a des années que je n'utilise plus de client
mail ni news...



Je n'échangerai mon gnus pour rien au monde!

--
Benoit Izac
1 2