Seite 1 von 1

Zahlen in 32-Bit nach IEEE_754

Verfasst: Samstag 4. Dezember 2010, 13:41
von Krakken
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!

Re: Zahlen in 32-Bit nach IEEE_754

Verfasst: Samstag 4. Dezember 2010, 13:55
von 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.

Re: Zahlen in 32-Bit nach IEEE_754

Verfasst: Samstag 4. Dezember 2010, 17:20
von Krakken
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

Re: Zahlen in 32-Bit nach IEEE_754

Verfasst: Samstag 4. Dezember 2010, 17:45
von Darii
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.

Re: Zahlen in 32-Bit nach IEEE_754

Verfasst: Samstag 4. Dezember 2010, 19:16
von Krakken
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...

Re: Zahlen in 32-Bit nach IEEE_754

Verfasst: Samstag 4. Dezember 2010, 19:19
von cofi
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.

Re: Zahlen in 32-Bit nach IEEE_754

Verfasst: Samstag 4. Dezember 2010, 19:29
von Krakken
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?

Re: Zahlen in 32-Bit nach IEEE_754

Verfasst: Samstag 4. Dezember 2010, 19:42
von 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.

Re: Zahlen in 32-Bit nach IEEE_754

Verfasst: Samstag 4. Dezember 2010, 19:43
von Krakken
THX an alle für die Hilfe!! Habs jetzt verstanden.

Re: Zahlen in 32-Bit nach IEEE_754

Verfasst: Samstag 4. Dezember 2010, 19:47
von /me
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.

Re: Zahlen in 32-Bit nach IEEE_754

Verfasst: Samstag 4. Dezember 2010, 20:10
von Gipsyjack
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.

Re: Zahlen in 32-Bit nach IEEE_754

Verfasst: Samstag 4. Dezember 2010, 20:23
von 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

Re: Zahlen in 32-Bit nach IEEE_754

Verfasst: Sonntag 5. Dezember 2010, 16:49
von Krakken
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...

Re: Zahlen in 32-Bit nach IEEE_754

Verfasst: Sonntag 5. Dezember 2010, 17:29
von 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'

Re: Zahlen in 32-Bit nach IEEE_754

Verfasst: Sonntag 5. Dezember 2010, 17:37
von Darii
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')?