OVH Cloud OVH Cloud

IEEE 754

9 réponses
Avatar
Olivier Miakinen
Bonjour,

M'étant intéressé au format des nombres flottants pour écrire ma
fonction de conversion en Hexadécimal, je me suis amusé à décortiquer
le format IEEE 754 doublé précision.

Le résultat (temporaire) se trouve ici :
<http://www.miakinen.net/tmp/number.js>
<http://www.miakinen.net/tmp/toHexa>

Mes tests semblent montrer que cela fonctionne bien, malgré une
bidouille que j'ai dû faire à cause des erreurs d'arrondi dans le
calcul des log.

Attention cependant : je ne peux pas distinguer les deux zéros (+0 et
-0) ni les (2^53 - 2) valeurs différentes de NaN (Not a Number), j'ai
donc dû choisir. Pour 0 j'affiche l'encodage IEEE de +0, quand à NaN
j'affiche celui qui est juste à côté de +infini.

Il est amusant de noter que dans l'immense majorité des cas, lorsque le
premier chiffre non nul de la représentation hexa est un 1, alors tous
les chiffres suivants se retrouvent tels quels dans la représentation
IEEE 754 -- et réciproquement. Voir en particulier les multiples de 1/3
et 1/7, et les multiples de PI.

Cordialement,
--
Olivier Miakinen
Aidez Saburi à rester près de sa famille et poursuivre ses études
en France, signez la pétition :
http://www.fcpe94.ouvaton.org/article_petition.php3?id_article=9

9 réponses

Avatar
Olivier Miakinen

Attention cependant : je ne peux pas distinguer les deux zéros (+0 et
-0)


Et pourtant si : je viens de trouver un moyen de les distinguer.
Qui d'autre saura le faire ? YD peut-être ? Ou bien ASM ? À moins
que ce ne soit Francis ? Les paris sont ouverts !


--
Olivier Miakinen
Aidez Saburi à rester près de sa famille et poursuivre ses études
en France, signez la pétition :
http://www.fcpe94.ouvaton.org/article_petition.php3?id_article=9

Avatar
ASM

Attention cependant : je ne peux pas distinguer les deux zéros (+0 et
-0)



Et pourtant si : je viens de trouver un moyen de les distinguer.
Qui d'autre saura le faire ? YD peut-être ? Ou bien ASM ? À moins
que ce ne soit Francis ? Les paris sont ouverts !


Houlà là !
je n'ai jamais réussi à équilibrer une compta
ce n'est pas pour aller me casser la tête
avec des plus de moins que rien !

--
Stephane Moriaux et son [moins] vieux Mac


Avatar
Dr John Stockton
JRS: In article <diefsv$gat$, dated Mon, 10 Oct
2005 21:38:59, seen in news:fr.comp.lang.javascript, Olivier Miakinen
<om+ posted :

Attention cependant : je ne peux pas distinguer les deux zéros (+0 et
-0)


Et pourtant si : je viens de trouver un moyen de les distinguer.
Qui d'autre saura le faire ? YD peut-être ? Ou bien ASM ? À moins
que ce ne soit Francis ? Les paris sont ouverts !



Lisez s.v.p. mon <URL:http://www.merlyn.demon.co.uk/js-maths.htm#Float>;
et puis mon http://www.merlyn.demon.co.uk/js-*.htm !

<QUOTE>
There are special values :-
The value NaN - Not-A-Number - is unequal to everything,
including itself; there is a function isNaN.
There are two non-finite numbers - plus and minus
Infinity; there is a function isFinite.
Plus and minus zero are representable and equal, but are
distinguishable by comparing reciprocals.
Denormals, where the exponent is lowest and the mantissa starts
with 0, have lessened proportional resolution; the lowest is about
4.94e-324.
</QUOTE>

X = +1/Infinity
Y = -1/Infinity
X == Y // true
1/X == 1/Y // false
1/X // Infinity
1/Y // -Infinity
1/(X*Y) // -Infinity

--
© John Stockton, Surrey, UK. ?@merlyn.demon.co.uk Turnpike v4.00 IE 4 ©
<URL:http://www.jibbering.com/faq/> JL/RC: FAQ of news:comp.lang.javascript
<URL:http://www.merlyn.demon.co.uk/js-index.htm> jscr maths, dates, sources.
<URL:http://www.merlyn.demon.co.uk/> TP/BP/Delphi/jscr/&c, FAQ items, links.


Avatar
Dr John Stockton
JRS: In article <diecvq$7ue$, dated Mon, 10 Oct
2005 20:49:16, seen in news:fr.comp.lang.javascript, Olivier Miakinen
<om+ posted :

M'étant intéressé au format des nombres flottants pour écrire ma
fonction de conversion en Hexadécimal, je me suis amusé à décortiquer
le format IEEE 754 doublé précision.


Lisez svp mon <URL:http://www.merlyn.demon.co.uk/js-misc0.htm>.


Pour calculer le jour de Paques, AFAIK les methodes de Zeller sont les
plis vites : <URL:http://www.merlyn.demon.co.uk/estrdate.htm>.

--
© John Stockton, Surrey, UK. ?@merlyn.demon.co.uk Turnpike v4.00 IE 4 ©
<URL:http://www.jibbering.com/faq/> JL/RC: FAQ of news:comp.lang.javascript
<URL:http://www.merlyn.demon.co.uk/js-index.htm> jscr maths, dates, sources.
<URL:http://www.merlyn.demon.co.uk/> TP/BP/Delphi/jscr/&c, FAQ items, links.

Avatar
Olivier Miakinen

Attention cependant : je ne peux pas distinguer les deux zéros (+0 et
-0)


Et pourtant si : je viens de trouver un moyen de les distinguer.
Qui d'autre saura le faire ? YD peut-être ? Ou bien ASM ? À moins
que ce ne soit Francis ? Les paris sont ouverts !


Lisez s.v.p. mon <URL:http://www.merlyn.demon.co.uk/js-maths.htm#Float>;

X = +1/Infinity
Y = -1/Infinity
X == Y // true
1/X == 1/Y // false
1/X // Infinity
1/Y // -Infinity
1/(X*Y) // -Infinity


Bravo ! 1/+0 = +Infinity et 1/-0 = -Infinity.
Il y a d'autres moyens plus compliqués, par exemple
Math.pow(+0,-1) = +Infinity et Math.pow(-0,-1) = -Infinity.

En revanche, il n'existe aucun moyen de distinguer les
9 007 199 254 740 990 variantes possibles de NaN.



Avatar
Olivier Miakinen

M'étant intéressé au format des nombres flottants pour écrire ma
fonction de conversion en Hexadécimal, je me suis amusé à décortiquer
le format IEEE 754 double précision.


Lisez svp mon <URL:http://www.merlyn.demon.co.uk/js-misc0.htm>.


Merci, je vais analyser tout ça.

Je pense malgré tout que mon approche (qui passe par un unique calcul
de logarithme) doit être plus rapide que :
<cit.>
while (Mt >= 2) {
Ex++;
Mt /= 2;
}
while (Mt < 1) {
Ex--;
Mt *= 2;
}
</cit.>

--
Olivier Miakinen
Aidez Saburi à rester près de sa famille et poursuivre ses études
en France, signez la pétition :
http://www.fcpe94.ouvaton.org/article_petition.php3?id_article=9


Avatar
ASM

M'étant intéressé au format des nombres flottants pour écrire ma
fonction de conversion en Hexadécimal, je me suis amusé à décortiquer
le format IEEE 754 double précision.


Lisez svp mon <URL:http://www.merlyn.demon.co.uk/js-misc0.htm>.



Merci, je vais analyser tout ça.

Je pense malgré tout que mon approche (qui passe par un unique calcul
de logarithme) doit être plus rapide que :
<cit.>
while (Mt >= 2) {
Ex++;
Mt /= 2;
}
while (Mt < 1) {
Ex--;
Mt *= 2;
}
</cit.>



vous allez finir par griller vos processeurs à force !

:-)

--
Stephane Moriaux et son [moins] vieux Mac



Avatar
Dr John Stockton
JRS: In article <dihb6k$15c6$, dated Tue, 11 Oct
2005 23:32:51, seen in news:fr.comp.lang.javascript, Olivier Miakinen
<om+ posted :

M'étant intéressé au format des nombres flottants pour écrire ma
fonction de conversion en Hexadécimal, je me suis amusé à décortiquer
le format IEEE 754 double précision.


Lisez svp mon <URL:http://www.merlyn.demon.co.uk/js-misc0.htm>.


Merci, je vais analyser tout ça.

Je pense malgré tout que mon approche (qui passe par un unique calcul
de logarithme) doit être plus rapide que :
<cit.>
while (Mt >= 2) {
Ex++;
Mt /= 2;
}
while (Mt < 1) {
Ex--;
Mt *= 2;
}
</cit.>


Mais serait-il toujours exact? En faisant des calculs de meme genre,
j'ai trouve que le calcul avec logarithms est souvent bon; bon pour le
plupart des occasions; mais pas toujours exact. <URL:http://www.merlyn.
demon.co.uk/js-demos.htm#DoRV>.

J'ai utilise (j'espere) ici seulement les operations qui seraient exacts
sur les nombres IEEE Doubles.

--
© John Stockton, Surrey, UK. ?@merlyn.demon.co.uk Turnpike v4.00 IE 4 ©
<URL:http://www.jibbering.com/faq/> JL/RC: FAQ of news:comp.lang.javascript
<URL:http://www.merlyn.demon.co.uk/js-index.htm> jscr maths, dates, sources.
<URL:http://www.merlyn.demon.co.uk/> TP/BP/Delphi/jscr/&c, FAQ items, links.



Avatar
Olivier Miakinen

Je pense malgré tout que mon approche (qui passe par un unique calcul
de logarithme) doit être plus rapide que :
<cit.>
while (Mt >= 2) {
Ex++;
Mt /= 2;
}
while (Mt < 1) {
Ex--;
Mt *= 2;
}
</cit.>


Mais serait-il toujours exact?


Non, bien sûr, mais cela se résout facilement en faisant une unique
multiplication ou division par 2, au lieu d'en faire plus de mille dans
le pire des cas.

En faisant des calculs de meme genre, j'ai trouve que le calcul avec
logarithms est souvent bon; bon pour le plupart des occasions; mais
pas toujours exact. <URL:http://www.merlyn.demon.co.uk/js-demos.htm#DoRV>.


Je confirme. Mes propres tests m'ont montré que le calcul de log(x)/LN2
suivi de floor() donnait parfois une valeur incorrecte, mais évidemment
la valeur correcte était juste à côté (toujours dans le même sens sur
les essais que j'ai faits, mais pour être sûr il vaut mieux toujours
prévoir de tester la valeur +1 et la valeur -1).

Quel dommage que l'on n'ait pas de fonction logarithme en base 2, qui
serait exacte par nature !

J'ai utilise (j'espere) ici seulement les operations qui seraient exacts
sur les nombres IEEE Doubles.


Oui, j'en suis persuadé. Les multiplications et divisions par 2 (et par
des puissances de 2) n'ont aucune raison de ne pas être justes tant que
l'on reste dans les nombres finis « normalisés ». De même pour les
additions et soustractions, tant que l'on reste dans des nombres entiers
inférieurs à 2^53 (ou les mêmes multipliés ou divisés par des puissances
de 2).

--
Olivier Miakinen
Aidez Saburi à rester près de sa famille et poursuivre ses études
en France, signez la pétition :
<http://www.fcpe94.ouvaton.org/article_petition.php3?id_article=9>