binäre Gleitkommazahlen zu normalen Dezimalzahlen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Jay-Pi
User
Beiträge: 19
Registriert: Dienstag 13. Februar 2007, 14:10

binäre Gleitkommazahlen zu normalen Dezimalzahlen

Beitragvon Jay-Pi » Freitag 2. März 2007, 14:41

Hallo,

ich bin heute am verzweifeln an der Darstellung von float/double Zahlen.

Ich habe Zahlen im Binärformat vorliegen und möchte das ganze am Ende in eine Text, XML oder sonstwas Form bringen, am besten im deutschen Format mit Komma.

Ich scheitere aber gerade daran, das die Werte sobald ich sie in ein Array packe im "binär" Format gespeichert und hinterher so ausgegeben werden.

Ziel:
1.0 => 1
5.9 => 5,9

Code: Alles auswählen

#!/usr/bin/env python
from struct import *

b0 = 1
b1 = 0
b2 = 100
b3 = 64

ieee754 = pack('8B', 0, 0, 0, 0, b0 & 0xFC, b1, b2, b3)
result , = unpack('<d', ieee754)
result /= 100

print result
#>>> 1.6

a= {}
a[0] = result
a[1] = 'test'
a[2] = 5.9

print a
#>>> {0: 1.6000000000000001, 1: 'test', 2: 5.9000000000000004}


Gruss
JP
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

Beitragvon HWK » Freitag 2. März 2007, 15:46

Das hat nichts mit pack/unpack zu tun. Floats an sich habe eine gewisse Ungenauigkeit. Entweder rundest Du manuell auf die gewünschte Genauigkeit oder Du verwendest das decimal-Standardmodul. Es gibt im Forum sicher auch zahlreiche Threads, die das noch weitergehend erklären.
MfG
HWK
Jay-Pi
User
Beiträge: 19
Registriert: Dienstag 13. Februar 2007, 14:10

decimal

Beitragvon Jay-Pi » Freitag 2. März 2007, 15:50

Hallo,

ich habe mir das decimal Modul in der offiziellen Python Doku bereits angeguckt, allerdings habe ich die Verwendung noch nicht ganz verstdanden.

bei decimal.Decimal(1.6)

bekomme ich am Ende im Array nur sowas wie {0: 'Decimal("1.6")', ... }
Ich suche mich nächste Woche mal durch.

Gruss
JP
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

Beitragvon HWK » Freitag 2. März 2007, 15:56

Z.B. so:

Code: Alles auswählen

>>> a = decimal.Decimal(str(1.6))
>>> a
Decimal("1.6")
>>> int(a)
1
>>> float(a)
1.6000000000000001
>>> str(a)
'1.6'
MfG
HWK
Jay-Pi
User
Beiträge: 19
Registriert: Dienstag 13. Februar 2007, 14:10

Lösung

Beitragvon Jay-Pi » Montag 5. März 2007, 13:56

Hallo,

ich habe jetzt meinen "Fehler" gefunden.

Mein Problem bestand eigentlich garnicht in der Zwischenspeicherung der Daten, sondern in der finalen Ausgabe.

In dem Script, welches die Werte am Ende Kommasperiert ausgibt war ein repr() für die Ausgabe von Zahlen, bzw nicht unicode gespeicherten werte. Allerdings mit dem Alias `v`. (Accent Grave)

Code: Alles auswählen

v = 1.6

if isinstance(v, unicode):
   v = v.encode('utf-8', 'backslashreplace')
else:
   v = `v`

print v
#>>> 1.6000000000000001


Ich werde das v = `v` durch str(v) ersetzen oder einfach nur print benutzen.

Danke für die Hilfestellung.

Gruss
JP

Wer ist online?

Mitglieder in diesem Forum: harryberlin