hässlich verdoppelt - warum 2.9000000000000004 statt 2,9? [Duplikat]

7

wenn ich 5.2 - 2.3 in ghci mache, bekomme ich 2.9000000000000004 statt 2.9. Auch solche hässlichen (und für ein menschliches FALSCHEN) Ergebnisse zeigen sich an anderen Stellen, wenn man mit Double oder Float arbeitet.

Warum passiert das? (Dies ist nur für Neugier, nicht meine eigentliche Frage)

Meine wahre Frage: Wie sage ich ghci, das nicht zu tun, und zeige die Ergebnisse von Operationen auf Doubles genau wie jede andere Programmiersprache (und jeder Rechner) und würde genauso wie jeder 15-Jährige sie schreiben?

Das ist einfach so nervig, wenn ich ghci als einen netten Rechner benutze und an Listen arbeite, auf denen ich solche Operationen durchführe.

%Vor%

Das hilft nicht, wenn Sie die Zahlen später auf einem Blatt Papier verwenden

Vielen Dank im Voraus:)

    
Dender 21.07.2013, 07:36
quelle

4 Antworten

8
  

Wie sage ich ghci, das nicht zu tun, und zeige die Ergebnisse von Operationen auf Doubles genau so wie jede andere Programmiersprache (und jeder Taschenrechner) und wie jeder 15-Jährige sie schreiben würde?

Da diese Ergebnisse die tatsächlichen Ergebnisse sind, die GHCI (und Ihr Standardrechner * ) berechnet, können Sie die interne Darstellung des Ergebnisses nicht ändern ( siehe TNIs Antwort ). Da Sie nur eine feste Anzahl von Dezimalstellen anzeigen möchten, ist es eher eine Frage der Präsentation (vergleichen Sie mit printf("%f.2",...) in C).

Eine Lösung dazu finden Sie in Ссылка . Es kann so angewendet werden:

%Vor%

Beachten Sie, dass dies nicht möglich ist, wenn Sie die Berechnung fortsetzen möchten. Wenn Sie genaue Arithmetik verwenden möchten, verwenden Sie Rationals auf jeden Fall. Vergiss nicht, dass deine Eingabe in diesem Fall auch rational sein sollte.

* Ja, sogar Ihr Standardrechner macht dasselbe, der einzige Grund, warum Sie ihn nicht sehen, ist die feste Darstellung, er kann nicht mehr als eine feste Anzahl von Dezimalzahlen anzeigen.

    
Zeta 21.07.2013, 08:11
quelle
18
  

Warum passiert das?

Weil bestimmte Gleitkommazahlen nicht durch eine endliche Anzahl von Bits ohne Rundung dargestellt werden können. Fließkommazahlen haben eine begrenzte Anzahl von Ziffern, sie können nicht alle real Zahlen genau: Wenn es mehr Ziffern gibt, als das Format erlaubt, werden die übriggebliebenen weggelassen - die Zahl ist gerundet.

Sie sollten wahrscheinlich lesen Was jeder Informatiker über Fließkomma-Arithmetik wissen sollte und diese Antwort .

    
NINCOMPOOP 21.07.2013 07:38
quelle
3

Es ist die Natur von Fließkommazahlen, dass sie nicht wirklich (oder rationale) Zahlen darstellen können. Die standardmäßige Umwandlung von Haskell in einen String stellt sicher, dass beim Einlesen der Zahl genau die gleiche Darstellung erhalten wird. Wenn Sie Zahlen anders drucken möchten, können Sie einen eigenen Typ erstellen, der Zahlen anders darstellt.

Etwas wie (ungetestet):

%Vor%

Dies erstellt eine Kopie des Typs Double , aber mit einer anderen Show -Instanz, die nur einige Dezimalstellen ausgibt. Die default -Deklaration veranlasst den Compiler, diesen Typ auszuwählen, wenn eine Mehrdeutigkeit vorliegt. Oh, und damit das funktioniert, braucht man ein paar Spracherweiterungen.

Sie können auch den CReal -Typ aus dem numbers -Paket ausprobieren.

    
augustss 21.07.2013 10:02
quelle
3
  

Wie sage ich ghci, das nicht zu tun, und zeige die Ergebnisse der Operationen   auf Doubles wie jede andere Programmiersprache (und Rechner)   würde

Hast du tatsächlich "irgendeine andere Programmiersprache" probiert? Oder machst du nur Mobbing?

FWIW, hier ist die Ausgabe eines Interpreters für eine Sprache, die die JVM verwendet:

%Vor%

Sieht für mich so aus, als ob Sie dasselbe Ergebnis mit allen JVM-Sprachen erhalten würden. Und da die JVM in C ++ geschrieben ist, besteht die Möglichkeit, dass das Ergebnis dasselbe ist. Und da die meisten Sprachen in C / C ++ geschrieben sind, haben Sie wahrscheinlich das gleiche Ergebnis auch mit diesen Sprachen. Sofern sie nicht so "benutzerfreundlich" sind und Rundungen durchführen, haben Sie nicht danach gefragt.

    
Ingo 21.07.2013 12:18
quelle

Tags und Links