Finden Sie Cube Wurzel einer Zahl Mit System.Math.Pow () - Methode in C#
Während ein Programm schreiben kam ich über das finden der cube Wurzel einer Zahl in einer meiner Funktionen.
wenn ich den code unten, ich war immer ein falscher Wert für den cube root (1
war immer, gedruckt für n = 64
).
public static void cubicPairs(double n)
{
double root = (System.Math.Pow(n, (1/3)));
Console.WriteLine(root);
}
Nun, nachdem ich änderte den code leicht auf dieser,
public static void cubicPairs(double n)
{
double root = (System.Math.Pow(n, (1.0/3.0))); //Changed how second parameter is passed
Console.WriteLine(root);
}
Bekam ich root = 3.9999999999999996
(beim Debuggen), aber die Methode war, den Druck 4
(was richtig ist).
Warum gibt es einen Unterschied zwischen den beiden Werten, und wenn dies hat zu tun mit dem zweiten parameter, um die System.Math.Pow()
Methode (ich.e 1.0/3.0
was ist eine rekursive Wert), was soll ich verwenden, zu finden, cube root, so daß ich 4
(beim Debuggen) eher als 3.9999999999999996
?
aber der parameter einen double-Wert und nicht ein int. Wenn es immer nach int umgewandelt, nicht haben sollte ich bekommen irgendwelche Fehler oder so?
Nein, da
int
implizit konvertierbar double
.vereinbart, aber sollte es kommen implizit in int konvertiert, wenn 1/3 soll nicht eine ganze Zahl sein, wie Sie die Methode-definition?
(1/3) ist eine ganze Zahl, was auch immer es sein soll. Die Laufzeit ist in der Lage, es zu konvertieren, was Sie wollen, also tut es.
InformationsquelleAutor gkb | 2014-09-09
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dies ist eine übliche Falle, in die { geschweiften Klammer Sprachen }, C# enthalten, eine division mit integralen Operanden durchgeführt wird, wie ein integer Teilung, nicht eine floating point division. Es bringt immer ein ganzzahliges Ergebnis
1 /3
produziert 0. Erhöhung einer Zahl mit power von 0 erzeugt 1.0Erzwingen Sie die Fließkomma-division durch eine Konvertierung eines Operanden zu verdoppeln. Wie
1.0 /3
oder(double)integerVariable /3
.Ähnliches problem mit der Multiplikation, aber in der Regel weniger von einer Falle, integralen Operanden erzeugen ein integraler Ergebnis, dass die Risiken überlauf. Diese ansonsten spiegelt wider, wie der Prozessor arbeitet, hat es deutliche Anweisungen für diese Operationen IMUL vs FMUL und IDIV vs FDIV. Letzteres eher bekannt für ein Fehler im Pentium-Prozessor 🙂
InformationsquelleAutor Hans Passant
Können Sie versuchen, diesen code für den cube-root-Funktionalität.
InformationsquelleAutor Nitin Gaur
Den Fehler (die, übrigens, ist nur
4E-16
- 400 quintillionths) ist verursacht durch floating-point-Fehler.Könnte man dies umgehen, indem Sie die Rundung der Zahl, wenn es innerhalb einer gewissen Schwelle:
Wo
VERY_SMALL_NUMBER
werden kann, sagen,1e-10
.InformationsquelleAutor Sean Latham
InformationsquelleAutor seyed
Versuchen Sie es
InformationsquelleAutor Ajay Kumar