Zahlen in 32-Bit nach IEEE_754

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.
Antworten
Krakken
User
Beiträge: 6
Registriert: Samstag 4. Dezember 2010, 13:34

Hallo,

also wie schon gesagt ich habe mir den wikipedia Artikel zum IEEE_754 http://de.wikipedia.org/wiki/IEEE_754 Standard mal durchgelesen und wollt jetzt gerne wissen, wie ich denn in numpy mit den Zahlen in 32-Bit darstellung rechnen und arbeiten kann??
Hab nicht wirklich was über google gefunden..

Und eine Frage zum Verständnis noch, wie genau wirkt sich denn jetzt die 32-Bit Darstellung auf die Nachkommastellen aus?


MfG

und noch ein schönes WE!
BlackJack

@Krakken: Du beginnst Deinen ersten Beitrag mit den Worten "also wie schon gesagt [...]"!? :-)

Schau mal auf der Homepage von `numpy` nach einem Tutorial. Grundsätzlich musst Du beim anlegen der Arrays den passenden Datentyp angeben, wenn Du nicht den vorgegeben Standard haben möchtest. Also in Deinem Fall `numpy.float32`. Wenn die Daten schon als Array-Objekt mit einem anderen Typ vorliegen, kannst Du mit der `astype()`-Methode eine Kopie mit dem entsprechenden Typ erstellen.

Weniger Bits bedeuten auch weniger Genauigkeit für die Zahl insgesamt. Wie viele für die Nachkommastellen zur Verfügung stehen, hängt ja auch von der Grösse der Zahl vor dem Komma ab.
Krakken
User
Beiträge: 6
Registriert: Samstag 4. Dezember 2010, 13:34

Ok danke, werd mal auf der Seite nachschauen.

hintegrund ist folgender, dass ich mit Pi rechnen will also auch:

Code: Alles auswählen

import math
math.pi
wie kreig ich python dazu, pi in 32bit darstellung auszugeben?

bzw dann noch mit Brüchen, will dann diese genauigkeit mit der "normalen" python math funktion vergleichen.


PS:

das wie schong esagt sollte sich auf den threadnamen beziehen :)

EDIT:

würde das so grundsätzlich gehen:

Code: Alles auswählen

import math
import numpy

i = (math.pi ,dtype=float)
print i
Darii
User
Beiträge: 1177
Registriert: Donnerstag 29. November 2007, 17:02

Krakken hat geschrieben:bzw dann noch mit Brüchen, will dann diese genauigkeit mit der "normalen" python math funktion vergleichen.
Was willst du da vergleichen? python-float hat 64bit also 15-16 Stellen Genauigkeit, 32-bit float hat 7-8 Stellen Genauigkeit.
würde das so grundsätzlich gehen:
Fast. Musst numpy dann auch benutzen.

Code: Alles auswählen

numpy.array(math.pi, dtype=numpy.float32).item() - math.pi
Ergibt wie erwartet 8 Stellen Genauigkeit.
Krakken
User
Beiträge: 6
Registriert: Samstag 4. Dezember 2010, 13:34

wenn ich

Code: Alles auswählen

numpy.array(math.pi, dtype=numpy.float32).item() - math.pi
eingebe bekomme ich als ergebniss:

Code: Alles auswählen

8.7422780126189537e-08
das entspricht sicherlich nicht pi...
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Krakken hat geschrieben:das entspricht sicherlich nicht pi...
Wenn doch, waere einiges mit der Subtraktion kaputt. Das sollte nicht mehr demonstrieren als die 8 Stellen Genauigkeit.
Krakken
User
Beiträge: 6
Registriert: Samstag 4. Dezember 2010, 13:34

Uupps 8.7422780126189537e-08 ist die Differenz zwischen dem 32bit pi aus numpy minus dem math.pi...
re
aber.. dann ist doch math.pi genauer? zumindest wenn man die einzelnen werte vergleicht mit den definierten stellen von pi, warum?
benutzt das math.pi noch mehr bits um pi darzustellen und erreicht somit eine höhere genauigkeit?
BlackJack

@Krakken: CPython's `float`-Datentyp hat 64-Bit bzw. ist ein C-`double`. Das ist dann natürlich genauer als ein 32-Bit-Fliesskommawert.
Krakken
User
Beiträge: 6
Registriert: Samstag 4. Dezember 2010, 13:34

THX an alle für die Hilfe!! Habs jetzt verstanden.
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Krakken hat geschrieben:benutzt das math.pi noch mehr bits um pi darzustellen und erreicht somit eine höhere genauigkeit?
Lies mal Floating Point Arithmetic: Issues and Limitations. Irgendwo in dem Artikel wirst du auf die Aussage "53 Bit" stoßen.
Gipsyjack
User
Beiträge: 23
Registriert: Samstag 13. November 2010, 20:19

Kann mir jemand den Befehl:

Code: Alles auswählen

numpy.array(math.pi, dtype=numpy.float32).item()
erklären??

Also ich verstehe, dass da ein numpy array angelegt wird und Inhalt in diesem array ist nur math.pi mi dtype wird die formatierung(?) des int angegeben.. aber was macht das ".item()"??

und warum kommt was anderes raus wenn ich z.b.

Code: Alles auswählen

i=numpy.array(math.pi, dtype=numpy.float32)
print i
eingebe??

Meine naheliegendste Erklärung wäre, dass .item() alle inhalte vom array ausgibt.. wenn ich das jetzt mit print i mache wird die zahl im array jedoch wieder umformatiert und somit nur math.pi wieder ausgegeben?

Hoffe meine frage ist verständlich genug.
BlackJack

@Gipsyjack: Das naheliegendste wäre es vielleicht einfach die Dokumentation zu konsultieren:

Code: Alles auswählen

In [301]: a = np.array(math.pi, dtype=np.float32)

In [302]: a.item?
Type:           builtin_function_or_method
Base Class:     <type 'builtin_function_or_method'>
String Form:    <built-in method item of numpy.ndarray object at 0xab731b0>
Namespace:      Interactive
Docstring:
    a.item()                                                                    
    
    Copy the first element of array to a standard Python scalar and return
    it. The array must be of size one.
Edit: Wobei der Umweg mit dem Array auch nicht unbedingt nötig ist:

Code: Alles auswählen

In [304]: np.float32()
Out[304]: 0.0

In [305]: np.float32(math.pi)
Out[305]: 3.1415927

In [306]: np.float32(math.pi) - math.pi
Out[306]: 8.7422780126189537e-08
Krakken
User
Beiträge: 6
Registriert: Samstag 4. Dezember 2010, 13:34

Noch ne kurze Frage:

Wenn ich mein Ergebnis als Hexadezimalzahl schreiben will wie krieg ich das denn hin für Kommazahlen?
Mit ganzen Zahlen geht es einfach:

Code: Alles auswählen

hex(Zahl)
bzw wenn man NUR die Hexadezimalzahl will:

Code: Alles auswählen

hex(Zahl)[2:]
aber wie mach ich das mit ner Kommazahl? hab über google was gefunden, das man es zuerst in ein String umschrieben soll, find ich aber nicht äußerst einleuchtend...
BlackJack

@Krakken: Wenn man nur die Hex-Darstellung haben möchte, ohne das '0x' am Anfang, kann man auch Zeichenkettenformatierung mit dem ``%``-Operator oder der `format()`-Methode auf Zeichenketten verwenden.

Bei Fliesskommazahlen stellt sich mir die Frage warum man das überhaupt will? Ansonsten ist es schon naheliegend die Zeichenkette, welche die zugrunde liegenden Bytes enthält als Basis für die Umwandlung zu nehmen. Zeichenketten sind in Python 2.x ja eigentlich keine Zeichen sondern Bytes.

Code: Alles auswählen

In [4]: np.float32(math.pi)
Out[4]: 3.1415927

In [5]: np.float32(math.pi).tostring()
Out[5]: '\xdb\x0fI@'

In [6]: np.float32(math.pi).tostring().encode('hex')
Out[6]: 'db0f4940'
Darii
User
Beiträge: 1177
Registriert: Donnerstag 29. November 2007, 17:02

Krakken hat geschrieben:Wenn ich mein Ergebnis als Hexadezimalzahl schreiben will wie krieg ich das denn hin für Kommazahlen?
Was für eine „Hexadezimalzahl“ willst du überhaupt haben? Die interne Repräsentation der Zahl wie von BlackJack vorgeschlagen, die Mantisse als „Hexadezimalzahl“ oder eine Hexadezimalbruchentwicklung (π -> '3.243F6A8885A3')?
Antworten