Math.Pow berechnet nicht korrekt

8

Ich habe ein Problem mit C #. Um genau zu sein mit dem Math.pow (). Wenn ich 15 ^ 14 berechnen möchte, bekomme ich "29192926025390624". Aber wenn ich es mit Wolfram Alpha berechne bekomme ich "29192926025390625". Wie Sie sehen können, ist dieser einzige Unterschied 1 Zahl. Wolfram Alpha ist jedoch korrekt. Warum ist C # nicht? und wie behebe ich das, damit ich den richtigen Wert in C # 7 bekommen kann?

Mein Code ist ziemlich einfach, da ich gerade mit hartcodierten Beispielen versuche. Also was ich mache ist: Math.Pow(15,14); Dies ergibt 29192926025390624 . Und nicht "29192926025390625", was die richtige Antwort ist.

Links: Wolfram Alpha

    
Ojtwist 28.11.2010, 15:21
quelle

6 Antworten

9

Math.Pow arbeitet mit Gleitkommatypen, die per Definition ungenau sind. Wenn Sie Ganzzahlen mit beliebiger Genauigkeit benötigen, verwenden Sie einen Integer-Typ beliebiger Genauigkeit, z. B. BigInteger Struktur. BigInteger hat auch eine Methode Pow .

    
Heinzi 28.11.2010, 15:27
quelle
4

Math.Pow arbeitet mit Doppelpunkten. Diese Implementierung mit langen bekommt die richtige Antwort:

%Vor%     
Yuriy Faktorovich 28.11.2010 15:31
quelle
3

Math.Pow arbeitet mit Doppelpunkten. Doppel sind 64-Bit Gleitkommazahl und haben etwa 15-16 Stellen Genauigkeit in C # und daher Was Sie sehen, ist ein Rundungsfehler. So funktionieren Gleitkommazahlen.

Wenn Sie mehr Präzision benötigen, versuchen Sie, dezimal zu verwenden. Es ist 128 Bits und verwendet 10 als Basis. Dies gibt Ihnen eine genaue Darstellung von Zahlen bis zu 28-29 signifikanten Ziffern. Sie können einfach Ihre eigene Pow-Methode für Dezimalzahlen definieren.

Wenn decimal nicht ausreicht, wechseln Sie zu BigInteger wurde in .NET 4 hinzugefügt.

    
driis 28.11.2010 15:27
quelle
1

Math.Pow () arbeitet korrekt mit dem doppelten Datentyp    Sehen Sie dies.

%Vor%

Hoppla, Sorry, Wert nach Haltepunkt prüfen; in deinem Programm;

    
Javed Akram 28.11.2010 15:48
quelle
0

C # 's Math.pow gibt eine Double, eine IEEE 754-Standard-Gleitkommazahl zurück. Es hat nur 15 signifikante Ziffern:

Ссылка http://math.byu.edu/~schow/work/IEEEFloatingPoint.htm

    
duffymo 28.11.2010 15:30
quelle

Tags und Links