Math.Pow ist die Berechnung nicht korrekt
Frage
ich habe ein Problem mit C # mit. Um genau zu sein mit dem Math.pow (). Wenn ich versuche, 15 ^ 14 zu berechnen dann bekomme ich „29192926025390624“. Aber wenn ich es mit Wolfram Alpha berechne ich bekommen „29192926025390625“. Wie Sie diesen Unterschied sehen kann, ist 1 Nr. Wolfram Alpha ist richtig though. Warum ist nicht C #? und wie kann ich dieses Problem beheben, damit ich den richtigen Wert in C # bekommen? 7
ist mein Code ziemlich einfach, da ich bin nur mit fest einprogrammierten Beispielen versuchen. Also, was ich tue ist: Math.Pow(15,14);
Das gibt 29192926025390624
. Und nicht „29192926025390625“, das ist die richtige Antwort.
Links: Wolfram Alpha
Lösung
Math.Pow
arbeitet auf Gleitkomma-Typen, die sind definitions ungenau. Wenn Sie beliebig genaue Zahlen benötigen, verwenden Sie einen beliebige Genauigkeit Integer-Typen wie die BigInteger Struktur. BigInteger hat auch eine Pow Methode.
Andere Tipps
Math.Pow arbeitet auf Doppelzimmer. Diese Implementierung mit lang wird die richtige Antwort:
Func<long, int, long> power = null;
power = (i, p) => p == 1 ? i : i*power(i, p - 1);
Console.WriteLine(power(15, 14));
Math.Pow arbeitet auf Doppelzimmer. Doubles sind 64-Bit-Gleitkomma- und haben etwa 15-16 Genauigkeitsziffern in C # , und daher, was Sie sehen, ist ein Rundungsfehler. Das ist, wie Punktzahl Arbeit schweben.
Wenn Sie mehr Präzision benötigen, versuchen dezimal . Es ist 128 Bits und verwendet 10 als Basis. Dies gibt Ihnen eine genaue Darstellung von Zahlen bis zu 28-29 signifikante Stellen. Sie können Ihre eigene Pow Methode für dezimal leicht definieren.
Wenn decimal
nicht genug ist, lesen Sie auf BigInteger , die in .NET 4 hinzugefügt wurde.
Math.Pow () korrekt funktioniert sein Problem mit doppeltem Datentyp sieht dies.
double i = 29192926025390625;
Console.WriteLine("{0}",i);//the result will be 29192926025390624.0
Oops Sorry, Prüfwert von Breakpoint; in Ihrem Programm;
C # 's Math.pow gibt ein Double, ein IEEE-754-Standard-Gleitkommazahl. Es hat nur 15 signifikante Stellen:
http://msdn.microsoft.com/en- us / library / system.math.pow.aspx http://math.byu.edu/~schow/work/IEEEFloatingPoint.htm