Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » Allgemeines (OffTopic) » Genauigkeit von Floatingpoint-arithmetik

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ]
000
12.12.2003, 19:26 Uhr
(un)wissender
Niveauwart



C++:
    
    double test = 1 - (0.18001 + 0.36001);
    cout << test << "\n";



Da ergibt: 0.45998000000000006.
sollte aber 0.45998 ergeben.
(g++ 3.3)

Was ist hier los?
Der Windowstaschenrechner bekommt das richtige Ergebnis.

Ich habe festgestellt, dass man der Rechnung des g++ 3.3 ab der achten Nachkommastellen nicht mehr trauen kann.

Was meint ihr?
--
Wer früher stirbt ist länger tot.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
12.12.2003, 19:36 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


Alles löschen

nein, mal im ernst probier mal

1.0 - ...

1 ist ein int-wert und wird dann "ungenau" beim konvertieren, also z.b

0.9999999999997

oder

1.0000000000043

usw
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
12.12.2003, 19:54 Uhr
0xdeadbeef
Gott
(Operator)


Ein Computer rechnet im Binärsystem, als Mensch gibt man die Zahlen aber dezimal an. Bei der Umwandlung kommt es aufgrund der beschränken Kapazität des Rechners zu Rundungsfehlern, deren Zeuge du gerade wurdest. Versuch mal, einFünftel binär aufzuschreiben.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
12.12.2003, 20:03 Uhr
Pablo
Supertux
(Operator)


Und das hängt auch davon ab, ob du Single oder Double Precision nimmst, also 32 Bit oder 64 Bit, dann ändert sich die Anzahl der Bits für das Exponent und für die Mantisse.

Soweit ich weiß, rechnen Taschenrechner Programme nicht mehr mit einfachen doubles, sondern mit Wrapper so wie Java. ich hab bei java solche Warpper Klassen zu floats und sowas gesehen, da ich sehr wenig mit solchen Zahlen arbeiten, weiß ich leider nicht, ob diese Aussage 100% wahr ist.
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!

Dieser Post wurde am 12.12.2003 um 20:03 Uhr von Pablo Yanez Trujillo editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
12.12.2003, 20:06 Uhr
(un)wissender
Niveauwart


Also erstmal macht es keinen Unterschied, ob ich 1 oder 1.0 schreibe, das Ergebnis ist gleich(falsch).
Warum kann der Windowsrechner das richtig? Rechnet der mit Integer und emuliert Fließkommazahlen?

Ich kenne das mit 0.2, habe es aber nie verstanden.
Laienhaft:
0 (positives Vorzeichen) 1 (Exponent) 10 (Mantisse) wäre bei 0.2.

Wie geht es richtig?
--
Wer früher stirbt ist länger tot.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
12.12.2003, 20:15 Uhr
Pablo
Supertux
(Operator)


0.2 = 2*10^-1. 2 = 10_2

1.0*2^-1 ist die Normalisierung.

Also, Exponent - BIAS = -1 ==> (Für Single Prec.) Exponent = 126 = 01111110_2

0 01111110 100 0000 0000 0000 0000 0000

Ich hoffe, ich hab mich nicht verrechnet!!!
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
12.12.2003, 20:26 Uhr
0xdeadbeef
Gott
(Operator)


Auf die Art kriegst du keine Fließkommazahl hin. Nach IEEE besteht eine Fließkommazahl aus einem Vorzeichenbit, ein paar Bits Exponent und dem Rest Mantisse. Der Wert der Zahl ist dann:

Code:
(+-) Mantisse * 2^Exponent


Die Mantisse besteht aus den Nachkommazahlen, sozusagen. Dabei führt man das Binärsystem konsequent weiter, also mit 2^-1, 2^-2 usw. Einige Werte für Mantissen wären:

Code:
1/2: 100000...
1/4: 010000...
1/8: 001000...


Um zum Beispiel ein Fünftel zusammenzubasteln, müsstest du das in Zweierpotenzen annähern, also:

Code:
1/5 ~ 1/8 + 1/16 + 1/128 + 1/256 + ... ~ 00110011...


...und damit kommst du irgendwann an das Ende deiner Kapazität.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
12.12.2003, 22:13 Uhr
(un)wissender
Niveauwart


Hm, danke!
--
Wer früher stirbt ist länger tot.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
12.12.2003, 22:24 Uhr
(un)wissender
Niveauwart


Warum hat man das eigentlich so gemacht?
Gibt es eine Möglichkeit einzustellen bis zu welcher Stelle gerechnet werden soll?
--
Wer früher stirbt ist länger tot.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
13.12.2003, 09:48 Uhr
Spacelord
Hoffnungsloser Fall


Such mal nach _controlfp .
Damit kannst du (zumindest unter Windows(VC++),g++?) die "Eigenschaften" von float-Rechengenauigkeit,Rundungsverhalten und Exceptions anpassen.
Für deine Rechnung würde float ja reichen.

MfG Spacelord
--
.....Ich mach jetzt nämlich mein Jodeldiplom.Dann hab ich endlich was Eigenes.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ Allgemeines (OffTopic) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: