Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Recensione Nothing Phone 4(a): sempre iconico ma ora più concreto
Recensione Nothing Phone 4(a): sempre iconico ma ora più concreto
Nothing con il suo nuovo Phone 4(a) conferma la sua identità visiva puntando su una costruzione che nobilita il policarbonato. La trasparenza resta l'elemento cardine, arricchita da una simmetria interna curata nei minimi dettagli. Il sistema Glyph si evolve, riducendosi nelle dimensioni ma aumentando l'utilità quotidiana grazie a nuove funzioni software integrate e notifiche visive. Ecco tutti i dettagli nella recensione completa
Corsair Vanguard Air 99 Wireless: non si era mai vista una tastiera gaming così professionale
Corsair Vanguard Air 99 Wireless: non si era mai vista una tastiera gaming così professionale
Nelle ultime settimane abbiamo provato la Corsair Vanguard Air 99 Wireless, una tastiera tecnicamente da gaming, ma che in realtà offre un ampio ventaglio di possibilità anche al di fuori delle sessioni di gioco. Flessibilità e funzionalità sono le parole d'ordine di una periferica che si rivolge a chi cerca un prodotto capace di adattarsi a ogni esigenza e ogni piattaforma
Ecovacs DEEBOT T90 PRO OMNI: ora il rullo di lavaggio è ampio
Ecovacs DEEBOT T90 PRO OMNI: ora il rullo di lavaggio è ampio
DEEBOT T90 PRO OMNI abbina un sistema di aspirazione basato su tecnologia BLAST ad un rullo di lavaggio dei pavimenti dalla larghezza elevata, capace di trattare al meglio le superfici di casa minimizzando i tempi di lavoro. Un robot completo che riesce anche ad essere sottile e garantire automazione ed efficienza nelle operazioni di pulizia di casa
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 24-04-2009, 15:38   #1
Simonex84
Senior Member
 
L'Avatar di Simonex84
 
Iscritto dal: Jun 2003
Messaggi: 15829
[Generico] problema con Floating-Point

Ho un problemino con i Floating-Point a singola precisione (32 bit)

Supponiamo di avere un programma che riceve in input un vettore di valori del tipo:

+2.124587e+000
-1.458789e+000
.....

poi per ogni valore fa questa operazione:

Codice PHP:
costante := +6.874521e+000

val 
:= (val*val*2.0)*costante 
e poi scrive in output tutti i val.

Bene se faccio girare questo programmino su un PowerPC 745 e su un Intel x86 a volte ho dei risutati diversi sull'ultima cifra di precisione, per esempio ho:

su ppc +2.485674e+000
su x86 +2.485675e+000

Non riesco a capire cosa succede, visto che le due cpu usano lo standard IEEE 754 dovrebbero fare calcoli ed approssimazioni nello stesso identico modo.

può essere legato al fatto che x86 è little-endian e il ppc è big-endian??
Simonex84 è offline   Rispondi citando il messaggio o parte di esso
Old 24-04-2009, 15:51   #2
gugoXX
Senior Member
 
L'Avatar di gugoXX
 
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
I float sono definiti in modo diverso anche nello standard IEEE
intendo, ci sono float a 32bit, a 64bit, a 128bit e anche ad 80bit (non proprio standard standard ma accettati ed estesi)
Il coprocessore degli intel internamente opera a 80bit, i PPC non penso, ma non penso comunque solo a 32bit come i tuoi input.
In pratica durante il caricamento dei registri del coprocessore avviene una conversione, una estensione.
I calcoli vengono fatti a 80bit, e poi quando vengono ritirati vengono di nuovo passati a 32bit per essere usati dal tuo programma.
Ecco quindi che i risultati possono essere leggermente diversi, pur attenendosi entrambi i processori allo standard IEEE.
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto.
E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test.
gugoXX è offline   Rispondi citando il messaggio o parte di esso
Old 24-04-2009, 16:24   #3
Simonex84
Senior Member
 
L'Avatar di Simonex84
 
Iscritto dal: Jun 2003
Messaggi: 15829
ma quindi quando l'intel passa da 32 a 80 bit i 48 bit di differenza cosa fa li riempie a caso??

Adesso sul manuale del ppc con quanti bit lavora il coprocessor
Simonex84 è offline   Rispondi citando il messaggio o parte di esso
Old 24-04-2009, 16:49   #4
gugoXX
Senior Member
 
L'Avatar di gugoXX
 
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
Quote:
Originariamente inviato da Simonex84 Guarda i messaggi
ma quindi quando l'intel passa da 32 a 80 bit i 48 bit di differenza cosa fa li riempie a caso??

Adesso sul manuale del ppc con quanti bit lavora il coprocessor
Ma mica a caso dai.
C'e' una corrispondenza ovvia per ciascun float a 32bit e un float a 80bit. Non si perde nulla ne si deve inventare nulla.
La parte restante della mantissa viene riempita con tutti 0, e l'esponente pure. Ovviamente un float a 32bit puo' essere scritto a 80bit senza problemi o ambiguita'.

Diverso e' invece il troncamento da 80bit a 32bit, essendo che la corrispondenza e' necessariamente multipla. Ma per questo ci sono gli algoritmi preposti dallo IEEE per il troncamento.
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto.
E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test.
gugoXX è offline   Rispondi citando il messaggio o parte di esso
Old 24-04-2009, 16:54   #5
BrutPitt
Senior Member
 
L'Avatar di BrutPitt
 
Iscritto dal: Mar 2009
Città: Bologna
Messaggi: 1174
Quote:
Originariamente inviato da Simonex84 Guarda i messaggi
ma quindi quando l'intel passa da 32 a 80 bit i 48 bit di differenza cosa fa li riempie a caso??

Adesso sul manuale del ppc con quanti bit lavora il coprocessor
No, vengono usati per eliminare la propagazione degli errori derivante dall'aumento di precisone dovuto ad operazioni consecutive.

Oltre a quanto scritto da gugoXX e aggiungo....

A volte dipende anche dal compilatore e dai "default" di compilazione... e possono veraiare da versione a versione, e da macchina a macchina.
Nel senso che alcuni compilatori, sapendo che affronteranno operazioni sul float, operano internamente in doppia precisione (sempre per il discorso propagazione errore), oltre che su registri del processore anche sul salvataggio temporaneo del risultato in aree di memoria "double"... altri usano le estenzioni SS2 a 128bit, se disponibile... altri in modalita' "fast-float" mantenendo celle di memoria a 32bit, sempre.
(e molte opzioni sono forzabili all'atto della compilazione)

Tralascio la "machine accuracy", che e' diversa dalla precisione di rappresentazione IEEE, e che solitamente e' rivolta alle funzioni complesse (sqrt, pow, sin, cos... etc.)... ma bisognerebbe dare anche un occhiata all'accuratezza della "printf" dei 2 compilatori, o chi per lei.

Insomma i fattori possono essere diversi... sicuramente non e' il fatto che uno sia big-endian e l'altro little-endian.
BrutPitt è offline   Rispondi citando il messaggio o parte di esso
Old 24-04-2009, 16:57   #6
Simonex84
Senior Member
 
L'Avatar di Simonex84
 
Iscritto dal: Jun 2003
Messaggi: 15829
Si in effetti ho detto una ca##ta, oggi sono fuso

Quindi alla fine intel carica i float a 32 bit in nel coprecessor a 80 bit fa i calcoli a 80 bit e poi un casting a 32 bit del risultato.

Il powerppc usando un coprecessor a 64 bit è meno preciso nei calcoli e lo scostamento deriva da questo.

Potresti dirmi dove hai trovato l'informazione che l'x86 usa un coprecessor a 80 bit??
Simonex84 è offline   Rispondi citando il messaggio o parte di esso
Old 24-04-2009, 17:01   #7
Simonex84
Senior Member
 
L'Avatar di Simonex84
 
Iscritto dal: Jun 2003
Messaggi: 15829
Quote:
Originariamente inviato da BrutPitt Guarda i messaggi
Tralascio la "machine accuracy", che e' diversa dalla precisione di rappresentazione IEEE, e che solitamente e' rivolta alle funzioni complesse (sqrt, pow, sin, cos... etc.)... ma bisognerebbe dare anche un occhiata all'accuratezza della "printf" dei 2 compilatori, o chi per lei.
Gli output li scrivo in binario e poi li converto in ascii con matlab quindi tra le due versioni in questa fase non possono esserci differenze.
Simonex84 è offline   Rispondi citando il messaggio o parte di esso
Old 24-04-2009, 17:22   #8
BrutPitt
Senior Member
 
L'Avatar di BrutPitt
 
Iscritto dal: Mar 2009
Città: Bologna
Messaggi: 1174
Quote:
Originariamente inviato da Simonex84 Guarda i messaggi
Gli output li scrivo in binario e poi li converto in ascii con matlab quindi tra le due versioni in questa fase non possono esserci differenze.
Allora una cosa in meno da controllare

Puoi vedere la rappresentazione interna dei registri FPU sul manuale Intel dell'IA32:
http://download.intel.com/design/pro...als/253665.pdf

Oppure graficamente anche qui:
http://www.sandpile.org/ia32/fp_old.htm
BrutPitt è offline   Rispondi citando il messaggio o parte di esso
Old 24-04-2009, 18:14   #9
Simonex84
Senior Member
 
L'Avatar di Simonex84
 
Iscritto dal: Jun 2003
Messaggi: 15829
Quote:
Originariamente inviato da BrutPitt Guarda i messaggi
Allora una cosa in meno da controllare

Puoi vedere la rappresentazione interna dei registri FPU sul manuale Intel dell'IA32:
http://download.intel.com/design/pro...als/253665.pdf

Oppure graficamente anche qui:
http://www.sandpile.org/ia32/fp_old.htm
Ottimo, grazie mille!!!! lunedì il mio capo sarà molto contento
Simonex84 è offline   Rispondi citando il messaggio o parte di esso
Old 24-04-2009, 21:18   #10
cdimauro
Senior Member
 
L'Avatar di cdimauro
 
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
Quote:
Originariamente inviato da BrutPitt Guarda i messaggi
A volte dipende anche dal compilatore e dai "default" di compilazione... e possono veraiare da versione a versione, e da macchina a macchina.
Nel senso che alcuni compilatori, sapendo che affronteranno operazioni sul float, operano internamente in doppia precisione (sempre per il discorso propagazione errore), oltre che su registri del processore anche sul salvataggio temporaneo del risultato in aree di memoria "double"... altri usano le estenzioni SS2 a 128bit, se disponibile... altri in modalita' "fast-float" mantenendo celle di memoria a 32bit, sempre.
(e molte opzioni sono forzabili all'atto della compilazione)
Le SSE2 a 128 bit, però, operano sempre con double. Non ci sono ancora float a 128 bit.
Quote:
Insomma i fattori possono essere diversi... sicuramente non e' il fatto che uno sia big-endian e l'altro little-endian.
Concordo: questo non c'entra niente.
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro
@LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro
Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys
cdimauro è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Recensione Nothing Phone 4(a): sempre iconico ma ora più concreto Recensione Nothing Phone 4(a): sempre iconico ma...
Corsair Vanguard Air 99 Wireless: non si era mai vista una tastiera gaming così professionale Corsair Vanguard Air 99 Wireless: non si era mai...
Ecovacs DEEBOT T90 PRO OMNI: ora il rullo di lavaggio è ampio Ecovacs DEEBOT T90 PRO OMNI: ora il rullo di lav...
Recensione Samsung Galaxy S26 Ultra: finalmente qualcosa di nuovo Recensione Samsung Galaxy S26 Ultra: finalmente ...
Diablo II Resurrected: il nuovo DLC Reign of the Warlock Diablo II Resurrected: il nuovo DLC Reign of the...
Gli utenti Intel possono dire addio all'...
NVIDIA: raggiungeremo almeno 1 triliardo...
Lenovo presenta workstation e server con...
Nuova BMW i3: la Serie 3 elettrica debut...
NVIDIA torna in Cina: stretto un accordo...
Vibe coding nel mirino di Apple: ecco le...
Smart TV QLED 50'' a un super prezzo: 4K...
Horizon Worlds lascia i visori Quest: Me...
Lexar compie 30 anni e cambia le regole ...
Questo SSD fornisce memoria aggiuntiva a...
PlayStation Portal si aggiorna: arriva l...
Akamai, le API nel mirino dei cyber atta...
Spider-Man: Brand New Day, finalmente on...
La serie TV di Hitman è ufficialmente fe...
"Grazie e arrivederci": Sam Al...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 21:17.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v