Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Fehler in Math.h???

Empfohlene Antworten

Veröffentlicht

Also ich wollte mal was ganz einfaches anstellen:

Den Sinus aus einer Zahl rausrechnen und dann wieder vom Sinus auf die Zahl kommen. Das macht man mit asin() aus Math.h. Das Ergebnis ist allerdings im Bogenmaß und muß erst wieder in Grad um gewandelt werden.

In der Math.h steht der Prototyp so drin:

double __cdecl asin(double);

float __cdecl asinf( float );

alles klar-> entweder double oder float als Input

d.h. daß als Argument ein double übergeben werden sollte!!! (bitte merken)

theoretisch sollte das hier funktionieren:

double x=sin(90);

x=acos(x)/3.14159265358979323*180;

ist aber nicht so... erst ein Casten von x auf was kleineres bringt die richtige Lösung:

x=acos((long)x)/3.14159265358979323*180;

Also vermutlich ist es notwendig, daß das Argument x sich in den unteren 32 Bit befindet, damit ein ordentliches Ergebnis rauskommt. Dann ist jedoch der Prototyp in Math.h nicht korrekt! Es sollte doch wenigstens eine Bereichsprüfung stattfinden, damit sowas nicht passiert, oder? Habt Ihr auch schon solche komischen Probleme mit mathematischen Funktionen gehabt? Oder mache ich etwas falsch? (ist ja alles möglich)

Hey Crush,

sin(90) liefert selbstverstaendlich nicht den Sinus von 90 Grad, weil, wie Du richtig anmerkst, der Winkel im Bogenmass gezaehlt wird. ;)

Ich weiss auch nicht, warum Du als Umkehrfunktion von sin() den acos() nimmst.

Uli

  • Autor

Das mit dem Bogenmaß war mir schon klar ... (richtig lesen)

Du hast irgendwas falsch verstanden:

Es ging um den (long)-cast:

x=acos((LONG)x)/3.14159265358979323*180;

acos verlangt float oder double, aber wenn ich das double Ergebnis von sin() wieder reinstecke kommt nur Müll bei raus. Nach diesem (long)cast stimmt das Ergebnis plötzlich unerwartet. Mir ging es darum, ob die Deklaration von acos in math.h fehlerhaft sein könnte oder die Funktion selbst, weil keine Bereichsprüfung für Wertüberschreitungen vorgenommen werden.

Wenn Du noch andere Methoden kennst (am besten Schnellere), wie ich vom Sinus auf den Winkel komme, dann würde mich das sehr interessieren!

<BLOCKQUOTE><font size="1" face="Verdana, Arial, Helvetica, sans-serif">Zitat:</font><HR>Original erstellt von Crush:

<STRONG>

Wenn Du noch andere Methoden kennst (am besten Schnellere), wie ich vom Sinus auf den Winkel komme, dann würde mich das sehr interessieren!</STRONG>

  • Autor

Aha, ich hab´s schon.

arcussinus x = x + 1*xhoch3/(2*3) + 1*3*xhoch5/(2*4*5) + 1*3*5*xhoch7/(2*4*6*7) ... usw

gar nicht so einfach ... ich glaube nicht, daß ich das sehr viel schneller hinbekomme als die FPU und die math-lib.

<FONT COLOR="#a62a2a" SIZE="1">[ 28. Oktober 2001 19:31: Beitrag 6 mal editiert, zuletzt von Crush ]</font>

<BLOCKQUOTE><font size="1" face="Verdana, Arial, Helvetica, sans-serif">Zitat:</font><HR>Original erstellt von Crush:

<STRONG> ich glaube nicht, daß ich das sehr viel schneller hinbekomme als die FPU und die math-lib.</STRONG>

Archiv

Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.