PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : double zu wenige stellen



darkmasta
22.02.2007, 19:38
hi

ich wollte vor kurzem ein C++ programm schreiben (ok...)

dabei habe ich einer double variable einen relativ großen Wert zugewießen


...
double a=44661136933246935817181986703472279701061600629660875489613.0;
...

diese liegt ja im im Wertebereich

problem
habe mir zahl wieder ausgeben lassen und es wird nur

44661136900....00.0000000e54 oder so änhnlich ausgegeben, viele stellen werden 0-gestetzt, sie sind aber wichtig.

ist das normal?????

mfg
darkmasta

Ynnus
22.02.2007, 19:54
Ja, das ist normal, weil Fließkomma-Zahlen in Variablen als Basis und Exponent gespeichert werden. Daher sind (theoretisch) unendlich große Zahlenwerte möglich, es treten aber Rundungsfehler auf. Und da die 8 byte des Doubles eben für Basis und Exponent geteilt werden (das genaue Verhältnis weiß ich grad nicht) stehen eben nur eine begrenzte Anzahl von Ziffern vor dem Komma zur Verfügung, wie auch begrenzte Ziffern als Exponent.

Andere Frage - wozu brauchst du in deinem Programm Variablen mit solch riesigen Werten bzw. wieso muss die Genauigkeit nach der 10ten Stelle von links noch so genau sein? Bei diesem riesigen Betrag müsste der Wert doch verschwindend unbedeutsam sein, ob nun 0 oder 9, oder was dazwischen...

nudelsalat
22.02.2007, 20:09
http://swox.com/gmp/
Die Library scheint Datentypen mit unbegrenzter Präzision anzubieten.

darkmasta
23.02.2007, 21:00
Andere Frage - wozu brauchst du in deinem Programm Variablen mit solch riesigen Werten bzw. wieso muss die Genauigkeit nach der 10ten Stelle von links noch so genau sein? Bei diesem riesigen Betrag müsste der Wert doch verschwindend unbedeutsam sein, ob nun 0 oder 9, oder was dazwischen...

weil es nicht um den betrag/Wert, sonder um die Zahl geht

ok, wenn das normal ist muss ich mir mal den link ansehen

Ynnus
24.02.2007, 12:12
Irgendwo hab ich mal gelesen, dass man unter C++ eigene Datentypen erstellen kann, die theoretisch auch 64 bit, 128 und mehr mehr haben können. Keine Ahnung wie genau das geht, hab ich noch nie gebraucht, aber mit 256 Bit kannst du Zahlen im Bereich von 1,1579208923731619542357098500869e+77 speichern, was selbst für deine Zwecke ausreichen sollte. ;)

raian
25.02.2007, 11:17
*schmunzel* Ich habe mich mal mit der Theorie auseinander gesetzt.

Es ist möglich. Und für mathecracks nicht sonderlich schwer. Man muss die Zahlen in ein anderes Zahlensystemsystem umrechnen.

100|10||0|-10|-100|

In ein högheres System urmechnen. Dabei gibt es nur halt programmeirerische Barrieren. Und wie gesagt.. nur die THeorie..die Praxis? keine Ahnung...>_<

jedenfalls habe ich meinen Mathe- und Informatiklehrer gefragt, der meinte so wäre es möglich eine höhere ANzahl an Nachkommastellen (und demnach auch VOrkommastellen) zu erreichen.

Solltest du soetwas schaffen wäre ich am Quellcode interessiert. ^^

DFYX
25.02.2007, 14:28
Das Problem bei der Sache ist, dass man weder im Binärsystem, noch im Hexadezimalsystem ein Zehntel genau darstellen kann. Deshalb arbeiten die meisten Libs, die höhere Genauigkeiten liefern sollen, mit Strings, in denen die Zahlen dezimal dargestellt werden. Das verschwendet zwar unheimlich viel Speicher (3 Bits pro Ziffer), ist dafür aber wirklich genau.

Ein anderer Ansatz wären Brüche, aber die sind nicht unbedingt einfach zu implementieren.

Ineluki
26.02.2007, 01:16
Ein anderer Ansatz wären Brüche, aber die sind nicht unbedingt einfach zu implementieren.

Na ja ein Struct und ein paar ueberladene Operatoren ... allerdings ...
Was ist mit irrationalen Zahlen ? Komplexen Zahlen, Octonionen, Hyperreellen Zahlen, Surrealen Zahlen, Games ... muss ich weiter machen ?

Die Frage gleibt aber immer noch, wofuer er so eine obskure Zahl braucht ? Wenn es nur um die Zahl geht, aber diese nicht verrechnet werden muss, kann er sie ja auch als z.B. Stringliteral verwenden ^__-