Math.Cbrt() Fehler / Visual Studio 2019

MikeD

Neues Mitglied
Guten Tag zusammen,

im "using System;" befindet sich doch die Methode cbrt(); zur Berechnung von Kubikwurzeln. Durch Zufall bin ich darauf gekommen, als ich diesen Fehler in Visual Studio gefunden habe...
Cbr Error.png

In älteren Framework-Versionen kann man die Kubikwurzel einer Zahl "x" mithilfe der Potenzfunktion und dem Exponenten
Wurzel.png
berechnen...
C:
double number_one, cube_root;
Console.Write("Geben Sie die Zahl ein, deren 3. Wurzel Sie ziehen möchten: ");

if (double.TryParse(Console.ReadLine(), out number_one)) {
  cube_root = Math.Pow(number_one, 1.0 / 3.0); // Kubikwurzel manuell berechnen
  Console.WriteLine($ "Die Kubikwurzel von {number_one} beträgt: {cube_root}");
} else {
  Console.WriteLine("Bitte eine gültige Zahl eingeben!");
}

So also der etwas andere Weg! Ist ja auch alles kein Beinbruch, aber ich möchte mal gerne wissen, warum zum Geier bei mir die Cbrt()-Funktion nicht funktioniert. Bis gestern hatte ich noch die Framework Version 4.7.2 installiert, was ich dann aber auf 4.8.1 in Visual Studio wie folgt aktualisiert habe...
  • Projekt im Visual Studio öffnen
  • Im Projektmappen-Explorer per rechter Maustaste auf das Projekt klicken und Option Eigenschaften wählen
  • Dann Im linken Bereich dieOption Anwendung wählen
  • Dann im Dropdown-Menü Ziel-Framework die aktuell ausgewählte Version überprüfen
  • Nun eine neuere Version (.NET Framework 4.8 oder besser ".NET 5" oder höher, falls zutreffend).
  • Änderungen speichern
Nach einem Neustart wird auch die neuere Framework Version 4.8.1 in Visual Studio angezeigt. Trotzdem wird diese Cbrt()-Funktion als Fehler im Editor angezeigt. Ich kann da machen, was ich will. Auch das ganze per Funktion...

C:
public
static double cube_root(double number_one) { return Math.Pow(zahl, 1.0 / 3.0); }

...funktioniert einfach nicht :mad:

Meine Frage: Kann mir mal bitte jemand sagen, woran das liegt? Kann mir eigentlich nicht vorstellen, das es an der Visual Studio 2019 Version liegt. Oder übersehe ich da etwas? Hat jemand von Euch das gleiche Problem (was ja eigentlich kein Problem ist!) ?

Ich bedanke mich schon im vorraus ;)
 
Hallo MikeD!

public static double cube_root(double number_one) { return Math.Pow(zahl, 1.0 / 3.0); }
Du nennst den Parameter number_one und nutzt in der Funktion die Variable zahl. Ein Parameter muss aber in der Funktion mit dem genau dem Namen genutzt werden, den man in der Parameterliste genutzt wird.

Laut https://www.geeksforgeeks.org/mathf-cbrt-method-in-c-sharp-with-examples/ ist die Methode Cbrt() im Namespace MathF. Ich habe aber grade kein Visual Studio zur Hand um das zu testen.

Es grüßt
Mupfel
 
Mupfel (Klasse Name :D)

ich weiß das mit der Variabel "zahl". Habs nur halt zu schnell geschrieben, aber das hat nichts mit dem eigentlichen Problem zu tun.
Auf meinem System habe ich einmal Visual Studio 2019 => unter Windows 10 und Visual Studio 2022 => unter Windows 11. Ich habs mit Visual Studio 2022 soeben ausprobiert und da geht es ohne Probleme.

Na ja, was solls. Ist ja auch kein Welteruntergang, aber ich hätte es zu gerne gewusst, warum es die Cbrt-Methode nicht im Namespace vorhanden ist. Ich könnte es ja hier hochladen, aber warum den Server damit belasten.
Ja, wie gesagt: Bei mir ist es nicht vorhanden. Alles andere wie "Sqrt, Sin, Cos, Tan..." ist dort vorhanden. Aber ;)Danke für die Antwort
 
EDIT: Ich finde zur Zeit die Fehler nicht, ich habe aber große Abweichungen zu dem, was rauskommen sollte. Die DAtntypen sind auch zu klein gewählt; long double sollte schon sein.

Mit Hilfe der Exponentialreihe kann man die allgemeine Potenzfunktion nachbauen:
C:
double exp(double exponent) {
  int zaehler = 1;
  int nenner = 1;
  double summe = 1;
  for (int i = 1; i < 10000; i++) {
    zaehler *= exponent;
    nenner *= i;
    summe += zaehler / nenner;
  }
  return summe;
}
Dann braucht man noch den Logarithmus, um die Basis allgemein verändern zu können:
C:
double log(double x) {
  x += 1.0; // edited
  short vorzeichen = 1;
  double summe = 0;
  int potenz = 1;
  for (int i = 1; i < 10000; i++) {
    potenz *= x;
    summe += vorzeichen * potenz / i;
    vorzeichen *= -1;
  }
  return summe;
}
mit
C:
double pow(double basis, double exponent) { return exp(log(basis) * exponent); }
solltest Du das fehlende Zeug ersetzen können. Ich habe es aber noch nicht getestet.
Edit: Den offensichtlichen Fehler habe ich in log() korrigiert.
 
Zuletzt bearbeitet:
Wo landest du den, wenn du der Definition von Math folgst.

Ich lande in der System.Private.CoreLib.dll aus der .NET 8 RTE.
1746528365665.png


Mircosoft gibt da jedoch teilweiße andere Referenzen an:
Möglicherweise haben die die Funktion wo anders hingeschoben.
 
Zurück
Oben Unten