Mathematik online lernen im Mathe-Forum. Nachhilfe online
Startseite » Forum » Programmieren mit Dezimalzahlen

Programmieren mit Dezimalzahlen

Universität / Fachhochschule

Tags: Dezimaldarstellung, Programmierung

 
Antworten Neue Frage stellen Im Forum suchen
Neue Frage
GeheimAgent001254

GeheimAgent001254 aktiv_icon

18:52 Uhr, 15.09.2023

Antworten
Hallo,

Ich habe mir nun den Unterschied zwischen einem Decimal Datentyp und eine Double Datentyp angeschaut.
Ich bin leider sehr verwirrt daraus hervorgegangen.
Eine Zahl 1,36 als Double liegt im Computer offenbar als 1,359999... irgendwas vor.
Einerseits brauchen decimals mehr Speicher, aber ist es nicht viel speicherintensiver 1,359999 zu speichern als 1,36?
Andererseits heißt der Double Datentyp wird für wissenschaftliche
Bereiche verwendet, aber gerade in diesem Bereich wird doch viel gerechnet; stauen sich da nicht diese kleinen Unterschiede zu großen Differenzen an?

Vielleicht könntet ihr mir diese Paradoxitäten erklären.

Gruß

Für alle, die mir helfen möchten (automatisch von OnlineMathe generiert):
"Ich möchte die Lösung in Zusammenarbeit mit anderen erstellen."
Online-Nachhilfe in Mathematik
Antwort
HAL9000

HAL9000

19:15 Uhr, 15.09.2023

Antworten
Die einzige Paradoxie die ich sehe ist, dass du reelle Zahlen mit endlicher Dezimaldarstellung als etwas besonders schützenswertes hinsichtlich Rechnung mit Floating-Point-Zahlen ansiehst. Dass eine Zahl wie 13 im Dezimalsystem mit endlichen vielen Stellen auch nicht genau repräsentiert werden kann, stört dich hingegen nicht?

Reelle Zahlen mit endlicher Dezimalbruchdarstellung lassen sich durch rationale Zahlen p10n darstellen. Wenn du partout GENAU mit diesen Zahlen rechnen willst (zumindest die vier Grundrechenarten), dann rechne mit diesen Zahlen und gewissen Bibliotheken (z.B. gmplib kennt den Datentyp "rationale Zahl") statt mit normalen Floating-Point-Zahlen. Es gibt also Alternativen für dieses "Problem".

GeheimAgent001254

GeheimAgent001254 aktiv_icon

20:14 Uhr, 15.09.2023

Antworten
Es geht nicht darum was ich verwenden will. Sondern darum zu verstehen, was ich verwende. Wie ergibt sich denn eine Doublezahl im Computer? Die weniger Speicher verbraucht als ihr Decimal Gegenstück und trotz mehr signifikanter stellen weniger genau ist.
Das ist bei 1/3 ja auch der Fall. Die Zahl wird als Double doch nicht genauer sein als als Decimal. Das wäre ja noch schlimmer, wenn es sich von Zahl zu Zahl anders verhält.

GeheimAgent001254

GeheimAgent001254 aktiv_icon

20:14 Uhr, 15.09.2023

Antworten
Es geht nicht darum was ich verwenden will. Sondern darum zu verstehen, was ich verwende. Wie ergibt sich denn eine Doublezahl im Computer? Die weniger Speicher verbraucht als ihr Decimal Gegenstück und trotz mehr signifikanter stellen weniger genau ist.
Das ist bei 1/3 ja auch der Fall. Die Zahl wird als Double doch nicht genauer sein als als Decimal. Das wäre ja noch schlimmer, wenn es sich von Zahl zu Zahl anders verhält.

Antwort
HAL9000

HAL9000

20:37 Uhr, 15.09.2023

Antworten
Sie sind nur weniger genau bei bestimmten endlichen Dezimalzahlen. Bei anderen reellen Zahlen sind sie genauer als Dezimalzahlrepräsentationen mit dem gleichen Speicherplatzbedarf: Z.B. kann die reelle Zahl

x=0,6371241672895848751068115234375

im Double-Format EXAKT gespeichert werden. Kann man das mit einem Dezimalformat, welches nur 8 Byte beansprucht auch?


> Wie ergibt sich denn eine Doublezahl im Computer?

Lies es einfach nach:
de.wikipedia.org/wiki/IEEE_754
de.wikipedia.org/wiki/Doppelte_Genauigkeit

13 wird in Double repräsentiert durch die Dezimalzahl

0,333333333333333314829616256247390992939472198486328125=254-13254=6004799503160661254 .


> Die Zahl wird als Double doch nicht genauer sein als als Decimal.

Ich weiß nicht, was dein "Decimal" für einen Speicherplatzbedarf hat. Wenn es auch nur 8 Byte wären (und da muss auch der Exponent mit rein), schafft es gewiss keine genauere Repräsentation von 13.


> Eine Zahl 1,36 als Double liegt im Computer offenbar als 1,359999... irgendwas vor.

Um genau zu sein: Tatsächlich ist es

1,3600000000000000976996261670137755572795867919921875=6124895493223875252.

Frage beantwortet
GeheimAgent001254

GeheimAgent001254 aktiv_icon

19:18 Uhr, 17.09.2023

Antworten
Ok, danke.

Der Decimal Datentyp ist 16 Byte groß und ist keine Gleitkommazahl. Damit kommt man von
E-28 bis E28.
Antwort
HAL9000

HAL9000

19:32 Uhr, 17.09.2023

Antworten
Ja, hab das inzwischen gelesen: Dieses Decimal scheint ein Microsoft-spezifisches Format zu sein, was sonst kaum Verbreitung gefunden hat.

Inhaltlich ist es das, was ich am 15.9., 19:15 angedeutet habe: Diese Zahlen werden als 96Bit-Integerzahl M gespeichert und zusätzlich ein Dezimalexponent E, also M10E. Kann man machen, wenn's einem Spaß macht - Anwendungen sehe ich allenfalls in der Finanzwirtschaft, wo man vielleicht peinlich genau Wert legt auf bestimmte Dezimalrundungen, d.h. nicht weniger genaue, aber im Einzelfall "andere" Binärdarstellungsrundungen ablehnt.