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!
Zahlen in 32-Bit nach IEEE_754
@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.
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.
Ok danke, werd mal auf der Seite nachschauen.
hintegrund ist folgender, dass ich mit Pi rechnen will also auch:
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:
hintegrund ist folgender, dass ich mit Pi rechnen will also auch:
Code: Alles auswählen
import math
math.pi
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
Was willst du da vergleichen? python-float hat 64bit also 15-16 Stellen Genauigkeit, 32-bit float hat 7-8 Stellen Genauigkeit.Krakken hat geschrieben:bzw dann noch mit Brüchen, will dann diese genauigkeit mit der "normalen" python math funktion vergleichen.
Fast. Musst numpy dann auch benutzen.würde das so grundsätzlich gehen:
Code: Alles auswählen
numpy.array(math.pi, dtype=numpy.float32).item() - math.pi
wenn ich
eingebe bekomme ich als ergebniss:
das entspricht sicherlich nicht pi...
Code: Alles auswählen
numpy.array(math.pi, dtype=numpy.float32).item() - math.pi
Code: Alles auswählen
8.7422780126189537e-08
- cofi
- Python-Forum Veteran
- Beiträge: 4432
- Registriert: Sonntag 30. März 2008, 04:16
- Wohnort: RGFybXN0YWR0
Wenn doch, waere einiges mit der Subtraktion kaputt. Das sollte nicht mehr demonstrieren als die 8 Stellen Genauigkeit.Krakken hat geschrieben:das entspricht sicherlich nicht pi...
Michael Markert ❖ PEP 8 Übersetzung ❖ Tutorial Übersetzung (3.x) ⇒ Online-Version (Python 3.3) ❖ Deutscher Python-Insider ❖ Projekte
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
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?
@Krakken: CPython's `float`-Datentyp hat 64-Bit bzw. ist ein C-`double`. Das ist dann natürlich genauer als ein 32-Bit-Fliesskommawert.
Lies mal Floating Point Arithmetic: Issues and Limitations. Irgendwo in dem Artikel wirst du auf die Aussage "53 Bit" stoßen.Krakken hat geschrieben:benutzt das math.pi noch mehr bits um pi darzustellen und erreicht somit eine höhere genauigkeit?
Kann mir jemand den Befehl:
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.
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.
Code: Alles auswählen
numpy.array(math.pi, dtype=numpy.float32).item()
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
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.
@Gipsyjack: Das naheliegendste wäre es vielleicht einfach die Dokumentation zu konsultieren:
Edit: Wobei der Umweg mit dem Array auch nicht unbedingt nötig ist:
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.
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
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:
bzw wenn man NUR die Hexadezimalzahl will:
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...
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)
Code: Alles auswählen
hex(Zahl)[2:]
@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.
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'
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')?Krakken hat geschrieben:Wenn ich mein Ergebnis als Hexadezimalzahl schreiben will wie krieg ich das denn hin für Kommazahlen?