Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

da decimale a IEEE-754 single precision

Linguaggi e sistemi

Moderatori: Foto UtentePaolino, Foto Utentefairyvilje

0
voti

[1] da decimale a IEEE-754 single precision

Messaggioda Foto UtenteLoScienziato » 24 gen 2018, 21:02

Salve mi potreste spiegare come convertire il numero 2^-135 in decimale secondo lo standard IEEE-754 a singola precisione?

Secondo la "scaletta" io dovrei:

1) convertire in binario il numero
2) normalizzarlo
3) codificare il segno
4) calcolare l'esponente polarizzato

Penso di avere problemi nel punto 1) come lo converto 2^-135 in binario?

Grazie
Avatar utente
Foto UtenteLoScienziato
10 4
New entry
New entry
 
Messaggi: 87
Iscritto il: 5 gen 2015, 20:59

0
voti

[2] Re: da decimale a IEEE-754 single precision

Messaggioda Foto UtenteLoScienziato » 25 gen 2018, 15:56

Grazie per le risposte, anche secondo me non era rappresentabile ma mi è stato consigliato di provare a fare 2^-126 * 2^-9 possibile?

verrebbe fuori "0 00000000 0000000010000000000"

dove l'1 è messo in 9° posizione della mantissa
Avatar utente
Foto UtenteLoScienziato
10 4
New entry
New entry
 
Messaggi: 87
Iscritto il: 5 gen 2015, 20:59

2
voti

[3] Re: da decimale a IEEE-754 single precision

Messaggioda Foto Utentexyz » 25 gen 2018, 18:10

Quel numero è non rappresentabile nello standard IEEE 754 a 32-bit come ti è stato detto.

Se non credi alla matematica puoi sempre provare a generare tu il numero giocando con i bit della mantissa e esponente:

https://evanw.github.io/float-toy
Avatar utente
Foto Utentexyz
6.864 2 4 6
G.Master EY
G.Master EY
 
Messaggi: 1778
Iscritto il: 5 dic 2009, 18:37
Località: Italy Turin

0
voti

[4] Re: da decimale a IEEE-754 single precision

Messaggioda Foto UtenteLoScienziato » 25 gen 2018, 19:24

Non è che non ci credo, anche a me non sembrava rappresentabile, eppure era presente in un esame universitario.
Probabile che abbia sbagliato il docente
Avatar utente
Foto UtenteLoScienziato
10 4
New entry
New entry
 
Messaggi: 87
Iscritto il: 5 gen 2015, 20:59

-4
voti

[5] Re: da decimale a IEEE-754 single precision

Messaggioda Foto UtenteDavideDaSerra » 26 gen 2018, 1:35

Vero, l'esponente può essere o un (signed) short o un unsigned short (intero a 8 bit), lo stesso numero, ma con esponente positivo, avresti quindi potuto quindi rappresentarlo.
Avatar utente
Foto UtenteDavideDaSerra
213 1 7
Expert
Expert
 
Messaggi: 279
Iscritto il: 21 gen 2018, 18:41

2
voti

[6] Re: da decimale a IEEE-754 single precision

Messaggioda Foto UtenteMassimoB » 26 gen 2018, 2:54

DavideDaSerra ha scritto:l'esponente può essere o un (signed) short o un unsigned short (intero a 8 bit),

No
MCSA Windows Server 2012 R2
Cisco CCNA R&S - Cisco CCNA Security - Cisco CCNA Cyber Ops
CompTia A+ - CompTia Linux+ - CompTIA Systems Support Specialist CSSS
CompTia Pentest+ LPIC-1 - VCP VMware - Cisco CCNP Enterprise
Avatar utente
Foto UtenteMassimoB
14,2k 6 12 13
Expert free
 
Messaggi: 3163
Iscritto il: 28 ott 2012, 9:56
Località: Milano

0
voti

[7] Re: da decimale a IEEE-754 single precision

Messaggioda Foto UtenteEcoTan » 26 gen 2018, 9:04

Leggo dall'help del mio basic:
Singles are stored as signed 32 bit binary numbers. Ranging in value from 1.5 x 10^–45 to 3.4 x 10^38
Dalla calcolatrice del Windows ottengo che:
2^-135=2,29e-41 cioè 2^-135 = 2,29 x 10^-41
quindi ci dovremmo stare dentro.

Allora si fa:
#include "math.h"
float prova;
prova = pow(2,-135);
Avatar utente
Foto UtenteEcoTan
7.720 4 12 13
Expert EY
Expert EY
 
Messaggi: 5421
Iscritto il: 29 gen 2014, 8:54

1
voti

[8] Re: da decimale a IEEE-754 single precision

Messaggioda Foto Utentexyz » 26 gen 2018, 12:36

Non ha senso di parlare di signed e unsigned dell'esponente, lo standard IEEE 754 prevede solo il signed e anche con esponente positivo il numero non è rapresentabile.

Se usate il GCC come compilatore definisce 2 variabili "__FLT_MAX__" e "__FLT_MIN__" che contengono il valore minimo e massimo del tipo "float", con il seguente comando è possibile vedere i limiti:

Codice: Seleziona tutto
echo | gcc -E -dM - | grep "__FLT_M\(IN\|AX\)__"

#define __FLT_MIN__ 1.17549435082228750796873653722224568e-38F
#define __FLT_MAX__ 3.40282346638528859811704183484516925e+38F


Se avete inlcude "float.h" sono definite 2 variabili "FLT_MAX" e "FLT_MIN" allo stesso modo.

La funzione "pow" della libreria matematica C è definita in double non in float (man pow):

Codice: Seleziona tutto
double pow(double x, double y);

Molto probabilmente la calcolatrice di MS-Windows calcola almeno in double e non in float.
Avatar utente
Foto Utentexyz
6.864 2 4 6
G.Master EY
G.Master EY
 
Messaggi: 1778
Iscritto il: 5 dic 2009, 18:37
Località: Italy Turin

0
voti

[9] Re: da decimale a IEEE-754 single precision

Messaggioda Foto UtenteEcoTan » 26 gen 2018, 14:12

EcoTan ha scritto:Leggo dall'help del mio basic:
Singles are stored as signed 32 bit binary numbers. Ranging in value from 1.5 x 10^–45 to 3.4 x 10^38
Dalla calcolatrice del Windows ottengo che:
2^-135=2,29e-41 cioè 2^-135 = 2,29 x 10^-41
quindi ci dovremmo stare dentro.

A bella posta ho citato la fonte delle mie informazioni perché so che la materia è "scivolosa".
Forse non mi sorprende che il Basic (parlo di Bascom per AVR) attribuisca, al formato floating a 32 bit, dei limiti massimo e minimo un po' diversi rispetto al C.
Avatar utente
Foto UtenteEcoTan
7.720 4 12 13
Expert EY
Expert EY
 
Messaggi: 5421
Iscritto il: 29 gen 2014, 8:54

0
voti

[10] Re: da decimale a IEEE-754 single precision

Messaggioda Foto Utentexyz » 26 gen 2018, 19:25

Sono andato a leggermi la revisione dello standard IEEE 754 chiamato IEEE 754-2008, prevede l'uso dei numeri non normalizzati:

https://en.wikipedia.org/wiki/Denormal_number

in pratica invece di avere la mantissa (normalizzata) con 1 al primo posto del tipo 1.xxxxxx si può avere la mantissa (non normalizzata) con degli zeri iniziali. Nella revisione IEEE 754-2008 per indicare un numero non normalizzato l'esponente con bias deve essere zero.

Quindi usando la revisione dello standard il numero 2^{-135} può essere rappresentato in questo modo in binario e esadecimale:

Codice: Seleziona tutto
0b00000000000000000100000000000000
0x00004000


il quale rappresenta il numero aprossimato 2.2958874 \cdot 10^{-41} uguale a 2^{-126} \cdot 2^{-9} =  2^{-135} come indicato nel post [4]

Quindi il numero incriminato non può essere rappresentato nello standard IEEE 754 ma nella sua revisione IEEE 754-2008. Aggiungo che l'uso dei numeri float con mantissa non normalizzata provoca una perdita di precisione, l'intervallo tra i numeri consecutivi è logaritmico e si ha un rallentamento nei calcoli, FPU non è in gradi di eseguire i calcoli rapidamente rispetto all'uso di una mantissa normalizzata.
Avatar utente
Foto Utentexyz
6.864 2 4 6
G.Master EY
G.Master EY
 
Messaggi: 1778
Iscritto il: 5 dic 2009, 18:37
Località: Italy Turin


Torna a PC e informatica

Chi c’è in linea

Visitano il forum: Nessuno e 6 ospiti