Bonjour,
Existe-t-il une notation des nombres à virgule flottante en base 2, 8 et 16 ?
Si oui, qu'elle est cette notation, je ne parviens pas à la trouver.
Bonjour,
Existe-t-il une notation des nombres à virgule flottante en base 2, 8 et 16 ?
Si oui, qu'elle est cette notation, je ne parviens pas à la trouver.
Dans le R5RS et le R6RS tu as string->number qui te permet de manipuler tes nombres en n'importe quel base (entière bien sûr). Cherche dans la doc pour plus d'info.
En MzScheme (je ne suis pas sûr que ce soit dans le R5RS)
Tu as floating-point-bytes->real pour convertir des octets en réel
Tu peux utiliser #b, #o, #d et #x pour indiquer le type.
Cherche la doc des « numbers » dans HelpDesk
Effectivement, cela ne fait pas parti du R5RS. Or c'est justement le R5RS qui m'interesseEn MzScheme (je ne suis pas sûr que ce soit dans le R5RS)
Tu as floating-point-bytes->real pour convertir des octets en réel
Tu peux utiliser #b, #o, #d et #x pour indiquer le type.
Cherche la doc des « numbers » dans HelpDesk
Mais les entier ne font pas parti de ma questionqui te permet de manipuler tes nombres en n'importe quel base (entière bien sûr)
Je ne sais pas, mais j'ai vraiment l'impression que ça n'existe pas en R5RS ! Je ne trouve aucune doc nul part. Quelqu'un pourrait-il confirmer ou infirmer ?
EDIT :
oui mais, comment faire pour un nombre à virgule flottante ?Tu peux utiliser #b, #o, #d et #x pour indiquer le type.
Peut-être devrais-tu suivre quelque cours de maths ??
Représentation en base entière, ne veux pas dire entier.
On représente nos nombres (réels) en base 10.
Donc si tu ne veux que le R5RS va voir du côté de string->number .
Avant de poser des questions, on va voir la doc comme je te l'ai dit au premier message Si tu as des questions à partir de là, n'hésites pas.
C'est même certain !Peut-être devrais-tu suivre quelque cours de maths ??
D'après les renseignements que m'ont communiqués les matheux, les nombres à virgule en base 2, 8 ou 16, s'appelent des nombres à virgule flottante.
WaouAvant de poser des questions, on va voir la doc comme je te l'ai dit au premier message
Je me suis probablement mal exprimé.
Ce qui m'intéresse c'est la représentation direct, la notation, pas comment convertir une chaine en nombre, même si ce nombre est bien au final en base 2, 8 ou 16. je ne cherche pas à les manipuler mais a connaitre la déclaration en dur.
string->number ne répond donc pas à ma préoccupation.
Je cherche à savoir si il y a une notation qui permet de faire référence à un nombre à virgule flottante en les notant comme des litéraux (en dur) :
par exemple en base 10 -> 10.545 -> (set! num 10.545)
Existe-t-il la même chose en base 2, 8 et 16 ? Et si oui comment ?
Et cela en R5RS.
Bizarre, tes "matheux"!
<Cours de maths>
Pour faire simple, disons qu'il y a les entiers et les réels.
3 est entier
pi est réel
2.5 est réel
Un entier n'est jamais qu'un réel particulier.
La représentation d'un réel X en virgule fixe en base B se fait avec
- un signe (+1 ou -1)
- une liste finie Ei représentatn la partie entière
- une liste finie ou infinie Di représentant la partie décimale
de manière que:
X = signe * (E0 + E1*B^1 + E2*B^2 + ... + D1*B^-1 + D2*B^-2 + ...)
La représentation d'un réel X en virgule flottante en base B (qui n'est pas nécessairement entière!!! mais positive non nulle) se fait avec:
de manière que: X == signe * mantisse * B ^ exposant
- un signe (+1 ou -1),
- une mantisse réelle (comprise entre 1/B et B)
- un exposant entier
"3" est une représentation de 3 en base dix
"11" est une représentation de 3 en base deux.
"3.14159265" est une représentation d'une approximation de pi, en virgule fixe, en base dix.
"0.31415926535 10E1" est une représentation d'une approximation de pi, en virgule flottante, en base dix.
Prenons le nombre 2.5 (en base dix).
"2.5" est l'écriture de 2.5 en virgule fixe en base dix.
"10.1" est l'écriture de 2.5 en virgule fixe en base deux
"0.25 10E1" est l'écriture de 2.5 en virgule flottante en base dix
"0.101 2E10" est l'écriture de 2.5 en virgule flottante en base deux
</Cours de maths>
Ben... il suffit d'écrire (setq x 1011001.001010001)
sous réserve que le reader lise en base deux.
En Le_Lisp, on écrirait:
Où est le problème?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 ? (with ((ibase 2)) (setq x (read) y (read))) 11.1 10.1 = 2.5 ? x = 3.5 ? y = 2.5 ? (with ((obase 2)) (print x)) 11.1 = 3.5
Attention!
Il y a un piège!
Si on écrit:
On obtient dans x : onze et un dixième!
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 ? (with ((ibase 2)) (setq x 11.1)) = 11.1
Car ibase n'agit que sur la lecture (reader).
Or l'expression lue (avant évaluation) est '(with ((ibase 2)) (setq x 11.1))
où les nombres "2" et "11.1" sont lus dans la base courante (dix)!
L'autre possibilité est de changer plus définitivement la base de lecture courante:
Mais attention! Pour revenir, il faut faire:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 ? (ibase 2) = 2 ? (setq x 11.1) = 3.5
car dix s'écrit "110" en base deux !
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 ? (ibase 110) = 10 ? (- x 3) = 0.5
C'est clair, chef?
Jacques
C'est très clair bien que les Math ne soient pas ma tasse de thé
à toi d'avoir pris tout ce temps pour m'expliquer cela. C'est toi qui est un chef !
Merci encore.
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager