Forum: PC-Programmierung double vs unsigned long long


von martin (Gast)


Lesenswert?

Die maximal darstellbare Zahl bei double liegt bei etwas ~ 10^306
was ungefähr 2^1023 entspricht.
unsigned long long bietet 2^64
und beide beanspruchen 8 Bytes.
Wenn ich nun Fakultät berechne, dann würde ich ULL nehmen.
Heute habe ich aber den Code gesehen, der double für diesen Zweck
benutzt.
Muss double nicht zu den wachsenden Zahlen hin, "Fehlerlücken"
haben, sodass mehrere natürliche Zahlen nicht darstellbar sind?

aus dem obigen Überlegungen würde ich sagen, ja .. die
Fehlapproximationen müssen grösser 1 sein.

würde gerne eure Meinung hören.

grüsse

von Andreas S. (andreas) (Admin) Benutzerseite


Lesenswert?

martin wrote:
> Muss double nicht zu den wachsenden Zahlen hin, "Fehlerlücken"
> haben, sodass mehrere natürliche Zahlen nicht darstellbar sind?

Ja: http://de.wikipedia.org/wiki/Gleitkommazahl#Dezimalzahlen

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

double ist ein floating-point-Format, das nur eine begrenzte Genauigkeit 
bietet. Bei normierter Darstellung kann die Genauigkeit durch die Anzahl 
der signifikanten Nachkommastellen ausgedrückt werden.

Normierte Darstellung bedeutet eine Vorkommastelle und ein 
entsprechender Exponent, also nicht 100.0, sondern 1.00 E2

Sehr große Zahlen können also durchaus absolute Fehler oder Fehlstellen 
enthalten.

von Gast (Gast)


Lesenswert?

Hallo,
in64 (long long) ist exakt für ganze Zahlen zwischen -2^32 bis 2^32-1.

Double, also 64Bit Floating Point, ist eine Zahl mit einer relativen 
Genauigkeit von 17 Stellen. also 0.12345678901234567 * 10^x. Genauer 
gesagt besitzt die Zahl eine 53Bit Mantisse, einen 10Bit Exponent und 
ein Vorzeichenbit.

Ein Double ist damit exakt für alle ganzen Zahlen bis ca. +/-2^54 oder 
eben alles, was maximal 54 signifikante Bits braucht.

von noch einer (Gast)


Lesenswert?

Ohne jetzt klugsch...en zu wollen ;-)

> in64 (long long) ist exakt für ganze Zahlen zwischen -2^32 bis 2^32-1.

int64 geht von -2^63 bis 2^63-1.

> Ein Double ist damit exakt für alle ganzen Zahlen bis ca. +/-2^54
> oder eben alles, was maximal 54 signifikante Bits braucht.

Oben war's noch richtig:

> 53Bit Mantisse

also ist der Bereich der lückenlos darstellbaren Ganzzahlen +/-2^53.

von Gast (Gast)


Lesenswert?

Hallo,
int64 geht von -2^63 bis 2^63-1, richtig, schäm!

Bei den Floats gibt es eine Konvention, die Mantisse ist normiert, so 
dass das erste Bit immer 1 ist, das wird dann weggelassen. Also 53Bits + 
1 weggelassenes ist 54Bits.

Gruss

von noch einer (Gast)


Lesenswert?

> Genauer gesagt besitzt die Zahl eine 53Bit Mantisse, einen 10Bit
> Exponent und ein Vorzeichenbit.

Du bist um eins verrutscht: Nach IEEE 754 hat ein double ohne die
führende 1 nur 52 Bits Mantisse, dafür aber 11 Bits Exponent.

http://de.wikipedia.org/wiki/IEEE_754#Zahlenformate_und_andere_Festlegungen_des_IEEE_754-Standards

Probe auf's Exempel:
1
>>> x=2.0**53
2
>>> x-1
3
9007199254740991.0
4
>>> x
5
9007199254740992.0
6
>>> x+1
7
9007199254740992.0
d.h. der Unterschied zwischen 2^53-1 und 2^53 wird gerade noch
aufgelöst, derjenige zwischen 2^53 und 2^53+1 nicht mehr.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.