OVH Cloud OVH Cloud

fonction template et ostream

30 réponses
Avatar
Alain Cabiran
bonjour,

j'ai un petit problème :

template<class A> std::ostream write(std::ostream & s, const A & valeur)
{
1) s.write(static_cast<const char *>(&valeur), sizeof(A));

ou

2) s.write(&valeur, sizeof(A));


return s;
}

ne fonctionnent pas. Quelqu'un a une idée de ce que je dois mettre
pour écrire un type quelconque en binaire ?

merci d'avance pour toute piste

Alain C.

10 réponses

1 2 3
Avatar
Gabriel Dos Reis
Jean-Marc Bourguet writes:

| "kanze" writes:
|
| > (Mais les machines Unix courantes ainsi que les machines Windows
| > utilisent tous le format IEEE.

James, qu'entends-tu par « format IEEE » ici ?

| > Il suffit donc d'utiliser l'image
| > comme une suite d'octets, dans un ordre prédéfini, si ça suffit
| > comme portabilité.)
|
| J'avais en tete (Gaby doit pouvoir confirmer) qu'une simple
| reorganisation des octets ne suffit pas toujours.

Yep. J'attends plus de précisions de la part de James.

-- Gaby
Avatar
Jean-Marc Bourguet
Gabriel Dos Reis me repondais au sujet
de la representation binaire des flottants?

| J'avais en tete (Gaby doit pouvoir confirmer) qu'une simple
| reorganisation des octets ne suffit pas toujours.

Yep. J'attends plus de précisions de la part de James.


Au fait, c'est quoi les autres differences?

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

Avatar
Gabriel Dos Reis
Jean-Marc Bourguet writes:

| Gabriel Dos Reis me repondais au sujet
| de la representation binaire des flottants?
|
| > | J'avais en tete (Gaby doit pouvoir confirmer) qu'une simple
| > | reorganisation des octets ne suffit pas toujours.
| >
| > Yep. J'attends plus de précisions de la part de James.
|
| Au fait, c'est quoi les autres differences?

Ben cela dépend vraiment de ce que James entend pas format IEEE.

IEEE-754 n'a pas définit un format, IEEE-754 a définit un modèle
mathématique qui n'est pas forcément ce que la machine concrètement.
Par exemple, HP et PowerPC ont tous les deux des formats qui sont
conformes à la spécification IEEE-754, mais les motifs de bits sont
différents sur HP et PowerPC -- HP semblent avoir pris un malin
plaisir à inverser un bit par rapport à la majorité des autres
machines.

-- Gaby
Avatar
Jean-Marc Bourguet
Gabriel Dos Reis writes:

Jean-Marc Bourguet writes:

| Gabriel Dos Reis me repondais au sujet
| de la representation binaire des flottants?
|
| > | J'avais en tete (Gaby doit pouvoir confirmer) qu'une simple
| > | reorganisation des octets ne suffit pas toujours.
| >
| > Yep. J'attends plus de précisions de la part de James.
|
| Au fait, c'est quoi les autres differences?

Ben cela dépend vraiment de ce que James entend pas format IEEE.

IEEE-754 n'a pas définit un format, IEEE-754 a définit un modèle
mathématique qui n'est pas forcément ce que la machine concrètement.


Les figures 1 et 2 du document que j'ai (qui provient directement du
site de l'IEEE) ressemble assez fort a ce que j'appelle un format, au
moins pour les single et les double. A survoller rapidement le
document, la seule chose qui me semble ambigue est de savoir si un NaN
est ou n'est pas signalant.

Par exemple, HP et PowerPC ont tous les deux des formats qui sont
conformes à la spécification IEEE-754, mais les motifs de bits sont
différents sur HP et PowerPC -- HP semblent avoir pris un malin
plaisir à inverser un bit par rapport à la majorité des autres
machines.


Aurai-je deviner l'objectif de ce bit? C'est deja de la chance si
c'est le meme bit qui a cet utilite.

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

Avatar
kanze
Jean-Marc Bourguet wrote:
"kanze" writes:

(Mais les machines Unix courantes ainsi que les machines
Windows utilisent tous le format IEEE. Il suffit donc
d'utiliser l'image comme une suite d'octets, dans un ordre
prédéfini, si ça suffit comme portabilité.)


J'avais en tete (Gaby doit pouvoir confirmer) qu'une simple
reorganisation des octets ne suffit pas toujours.


Officiellement, non. Au moins, pas en ce qui concerne la norme
IEEE. Pratiquement, pour les machines en question, oui.

Dès qu'on suppose IEEE, on a perdu la portabilité. Je crois que
les exigeances supplémentaires pour qu'un simple réorganisation
des octets suffit ne coûtera pas beaucoup plus en ce qui
concerne la portabilité.

--
James Kanze GABI Software
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34


Avatar
kanze
Gabriel Dos Reis wrote:
Jean-Marc Bourguet writes:

| Gabriel Dos Reis me repondais
| au sujet de la representation binaire des flottants?

| > | J'avais en tete (Gaby doit pouvoir confirmer) qu'une
| > | simple reorganisation des octets ne suffit pas toujours.

| > Yep. J'attends plus de précisions de la part de James.

| Au fait, c'est quoi les autres differences?

Ben cela dépend vraiment de ce que James entend pas format IEEE.

IEEE-754 n'a pas définit un format, IEEE-754 a définit un
modèle mathématique qui n'est pas forcément ce que la machine
concrètement.


Pour parler en termes de Unicode : ils ont défini un encodage,
mais pas une représentation. Je sais.

Par exemple, HP et PowerPC ont tous les deux des formats qui
sont conformes à la spécification IEEE-754, mais les motifs de
bits sont différents sur HP et PowerPC -- HP semblent avoir
pris un malin plaisir à inverser un bit par rapport à la
majorité des autres machines.


Je serais intéressé à connaître les détails. Parce que j'ai
déjà travaillé sur les deux machines, et je ne me rappelle pas
d'avoir remarquer une différence. (Mais je ne l'ai pas cherchée
non plus ; c'est donc fort possible qu'elle m'est passée
inaperçue.)

--
James Kanze GABI Software
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34

Avatar
kanze
Jean-Marc Bourguet wrote:
Gabriel Dos Reis writes:

Jean-Marc Bourguet writes:

| Gabriel Dos Reis me
| repondais au sujet de la representation binaire des
| flottants?

| > | J'avais en tete (Gaby doit pouvoir confirmer) qu'une
| > | simple reorganisation des octets ne suffit pas
| > | toujours.

| > Yep. J'attends plus de précisions de la part de James.

| Au fait, c'est quoi les autres differences?

Ben cela dépend vraiment de ce que James entend pas format
IEEE.

IEEE-754 n'a pas définit un format, IEEE-754 a définit un
modèle mathématique qui n'est pas forcément ce que la
machine concrètement.


Les figures 1 et 2 du document que j'ai (qui provient
directement du site de l'IEEE) ressemble assez fort a ce que
j'appelle un format, au moins pour les single et les double.


C'est un « format ». Mais la question est ce que signifie au
juste ce format. Je crois qu'il est généralement admis qu'il ne
décrit pas une représentation physique ; une machine avec des
mots de 36 bits, par exemple, pourrait insérer des bits sans
signification où il veut, et à la rigueur, une machine pouvait
même intercaler des bits de exposant dans la mantisse.

Reste que la présentation graphique est très suggestive ; on
calque le « format » sur un entier (pris comme champs de bits --
donc normalement non-signé) de 32 ou de 64 bits. Avec donc le
bit de signe comme bit de poid fort, puis les bits d'exposant,
puis la mantisse. Et en fait, je n'ai jamais entendu parler
d'une machine qui faisait autrement. (Mais il y a beaucoup que
je ne connais pas dans ce domaine.) Ce qui veut dire que les
différences de « format » se résume à des différences dans la
représentation des entiers non-signés de 32 ou de 64 bits. Ce
qui, sur les machines à adressage octet avec une taille de mot
puissance de deux fois huit, se résume à des variations dans
l'ordre des octets.

Enfin, c'est ce que je crois. Comme j'ai dit, je n'ai pas
beaucoup d'expérience dans ce domaine, et j'attends avec
impatience une confirmation ou une explication d'où je me trompe
de la part de Gabri (qui s'y connaît réelement beaucoup mieux
que moi ici).

(Note bien que si un float est calqué sur un entier de 32 bits,
on pourrait très bien le représenter en UTF-8. Je crois
néaumoins que la risque de rencontrer une telle machine est
assez faible que je peux la negliger. De toute façon, elle est
moins que la risque de rencontrer une machine qui utilise un
tout à fait autre format.)

A survoller rapidement le document, la seule chose qui me
semble ambigue est de savoir si un NaN est ou n'est pas
signalant.


Ben, quand je parlais des formats externes, je ne pensais pas
aux NaN et compagnie. Dans la mesure où on traite la valeur
comme un entier non signé lors des entrées/sorties, il serait
assez trivial de « normaliser » la valeur des NaN dans la
représentation externe.

--
James Kanze GABI Software
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34


Avatar
Gabriel Dos Reis
Jean-Marc Bourguet writes:

[...]

| > Par exemple, HP et PowerPC ont tous les deux des formats qui sont
| > conformes à la spécification IEEE-754, mais les motifs de bits sont
| > différents sur HP et PowerPC -- HP semblent avoir pris un malin
| > plaisir à inverser un bit par rapport à la majorité des autres
| > machines.
|
| Aurai-je deviner l'objectif de ce bit? C'est deja de la chance si
| c'est le meme bit qui a cet utilite.

C'est le bit le plus significatif de la partie « fractionnaire ».
HP dit que si tu as un NaN et que ce bit est 1 alors c'est un
signaling NaN. Les autres disent que ça doit être à 0.

http://docs.hp.com/en/B3906-90006/go01.html#d0e21300

-- Gaby
Avatar
kanze
Gabriel Dos Reis wrote:
Jean-Marc Bourguet writes:

[...]

| > Par exemple, HP et PowerPC ont tous les deux des formats
| > qui sont conformes à la spécification IEEE-754, mais les
| > motifs de bits sont différents sur HP et PowerPC -- HP
| > semblent avoir pris un malin plaisir à inverser un bit par
| > rapport à la majorité des autres machines.

| Aurai-je deviner l'objectif de ce bit? C'est deja de la
| chance si c'est le meme bit qui a cet utilite.

C'est le bit le plus significatif de la partie « fractionnaire ».
HP dit que si tu as un NaN et que ce bit est 1 alors c'est un
signaling NaN. Les autres disent que ça doit être à 0.

http://docs.hp.com/en/B3906-90006/go01.html#d0e21300


Donc, si j'ai un traitement spécial des NaN, pour la reste,
sortir les bits d'un IEEE double comme si c'était un unsigned
long long serait portable (dans la pratique -- je sais que
strictement parlant, la norme IEEE ne parle pas de la
représentation physique en mémoire) entre toutes les machines
qui utilise IEEE et où les long long (et les double, évidemment)
sont 64 bits ? (Je suppose que l'écriture des long long est
implémentée de façon portable, indépendamment de l'ordre des
octets.)

--
James Kanze GABI Software
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34

Avatar
Gabriel Dos Reis
"kanze" writes:

| Gabriel Dos Reis wrote:
| > Jean-Marc Bourguet writes:
|
| > [...]
|
| > | > Par exemple, HP et PowerPC ont tous les deux des formats
| > | > qui sont conformes à la spécification IEEE-754, mais les
| > | > motifs de bits sont différents sur HP et PowerPC -- HP
| > | > semblent avoir pris un malin plaisir à inverser un bit par
| > | > rapport à la majorité des autres machines.
|
| > | Aurai-je deviner l'objectif de ce bit? C'est deja de la
| > | chance si c'est le meme bit qui a cet utilite.
|
| > C'est le bit le plus significatif de la partie « fractionnaire ».
| > HP dit que si tu as un NaN et que ce bit est 1 alors c'est un
| > signaling NaN. Les autres disent que ça doit être à 0.
|
| > http://docs.hp.com/en/B3906-90006/go01.html#d0e21300
|
| Donc, si j'ai un traitement spécial des NaN, pour la reste,
| sortir les bits d'un IEEE double comme si c'était un unsigned
| long long serait portable (dans la pratique -- je sais que
| strictement parlant, la norme IEEE ne parle pas de la
| représentation physique en mémoire) entre toutes les machines
| qui utilise IEEE et où les long long (et les double, évidemment)
| sont 64 bits ? (Je suppose que l'écriture des long long est
| implémentée de façon portable, indépendamment de l'ordre des
| octets.)

Il y a des machines ARM qui ont une façon intéressante de représenter
les doubles de manière interne. Les flottants avec une précision
supérieure à double sont représentés sur plusieurs mots (double
prendre 2 mots), où l'ordre des bytes à l'intérieur d'un mot n'est pas
le même que l'ordre des mots à l'intérieur de l'objet.

-- Gaby
1 2 3