Warum definiert math.h pi, pi/2, 2/pi, aber nicht 2*pi? [closed]

Lesezeit: 4 Minuten

Benutzer-Avatar
Hanno

Dies ist eine wirklich einfache Frage: Warum gibt es vordefinierte Konstanten für pi, pi/2, pi/4, 1/pi und 2/pi, aber nicht für 2*pi? Steckt dahinter ein tieferer Grund?

Bei dieser Frage geht es nicht um das Ganze pi vs tau debatte. Ich frage mich, ob es einen technischen Grund gibt, bestimmte Konstanten zu implementieren, andere jedoch nicht. Mir fallen zwei Möglichkeiten ein:

  1. Vermeidung von Rundungsfehlern.
  2. Vermeidung von Laufzeitteilungen, die teurer sein könnten.

  • Was würdest du verwenden wollen 2*pi zum? Die meisten trigonometrischen Funktionen zum Beispiel “wiederholen” sich danach 2*pi (haben eine Translationssymmetrie von 2*pi). (Formeller zum Beispiel sin(a) = sin(b) wenn a = b (mod 2*pi).) Dies macht es nutzlos zu addieren oder zu subtrahieren 2*pi zu oder von Zahlen, die Sie als Argumente für diese Funktionen verwenden.

    – MvanGeest

    17. November 2012 um 0:58 Uhr


  • @MvanGeest Es gibt so viele Anwendungsfälle. Wie wäre es mit Normalverteilungen, schnellen Fourier-Transformationen, Cauchy-Integralen für den Anfang?

    – Hanno

    17. November 2012 um 1:05 Uhr


  • Warum haben sie nicht auch definiert 3*pi, 12*piund -4*pi? Diese Frage verlangt nach einer Diskussion, die keine endgültige Antwort hat, es sei denn, einer der ursprünglichen Autoren von math.h kommt zufällig vorbei, um sie zu beantworten. Tut mir leid, aber ich stimme für das Schließen als nicht konstruktiv; die FAQ erwähnen ausdrücklich Diskussions- und Spekulationsfragen als unangemessen für das Design hier.

    – Ken Weiß

    17. November 2012 um 1:07 Uhr

  • @Ken: oder einer der Autoren hat an anderer Stelle darauf geantwortet, und jemand kann diese Antwort finden und darauf verweisen. Ich verstehe wirklich nicht, warum die Leute denken, dass Standardfragen zur Begründung unbeantwortbar sind – die Meetings werden (etwas) protokolliert.

    – Steve Jessop

    17. November 2012 um 1:19 Uhr

  • Es ist mir wichtig, weil ich diese Konstante ungefähr 100 Mal am Tag tippe.

    – Hanno

    17. November 2012 um 1:26 Uhr

Ist 2*M_PI so schwer zu schreiben?

Aber mal im Ernst, als sich die Leute einst Sorgen um einfache Compiler machten, die vielleicht keine konstante Faltung machen und die Division unerschwinglich teuer war, war es tatsächlich sinnvoll, eine konstante PI/2 zu haben, anstatt eine Laufzeitdivision zu riskieren. In unserer modernen Welt würde man wahrscheinlich einfach M_PI definieren und damit Schluss machen, aber die anderen Varianten leben aus Gründen der Abwärtskompatibilität weiter.

  • @SteveJessop: Würde es auf Plattformen mit Basis-2-Gleitkommazahlen (dh auf allen Plattformen, die uns wichtig sind) nicht immer genau das gleiche Ergebnis liefern? (dh es wäre M_PI mit 1 zum Exponenten addiert)

    – Dietrich Ep

    17. November 2012 um 1:22 Uhr


  • Achten Sie darauf, die Dinge nicht zu verwechseln: M_2_PI ist definiert als 2/pi.

    – Hanno

    17. November 2012 um 1:24 Uhr

  • @stevejessop: Multiplikation mit 2 ist exakt (außer Überlauf, was hier eindeutig nicht vorkommt)

    – Stefan Kanon

    17. November 2012 um 1:24 Uhr

  • @Dietrich: Ja, ich denke, ich bin dumm.

    – Steve Jessop

    17. November 2012 um 1:25 Uhr

  • (Beachten Sie, dass die Division durch zwei auch genau ist; M_PI_2 kauft auch keine Genauigkeit.)

    – Stefan Kanon

    17. November 2012 um 1:27 Uhr

Das ist nur meine Vermutung.

Ich nehme an, dass diese Konstanten mit den Implementierungen verschiedener Funktionen in der Mathematikbibliothek zusammenhängen:

ck@c:~/Codes/ref/glibc/math$ grep PI *.c
s_cacos.c:  __real__ res = (double) M_PI_2 - __real__ y;
s_cacosf.c:  __real__ res = (float) M_PI_2 - __real__ y;
s_cacosh.c:                    ? M_PI - M_PI_4 : M_PI_4)
...
s_clogf.c:      __imag__ result = signbit (__real__ x) ? M_PI : 0.0;
s_clogl.c:      __imag__ result = signbit (__real__ x) ? M_PIl : 0.0;
ck@c:~/Codes/ref/glibc/math$ 

M_PI, M_PI_2und M_PI_4 tauchen ziemlich oft auf, aber es gibt keine 2.0 * M_PI. Also zu Hannos ursprünglicher Frage, ich denke, MvanGeest hat recht — 2π ist einfach nicht so nützlich, zumindest bei der Implementierung libm.

Jetzt ungefähr M_PI_2 und M_PI_4, ihre Existenz ist gut begründet. Das Dokumentation der GNU C-Bibliothek schlägt vor, dass “diese Konstanten aus dem Unix98-Standard stammen und auch in 4.4BSD verfügbar waren”. Compiler waren damals nicht so schlau. Tippen M_PI/4 Anstatt von M_PI_4 kann eine unnötige Teilung verursachen. Obwohl moderne Compiler dies wegoptimieren können (gcc verwendet mpfr seit 2008, sodass sogar Rundungen korrekt durchgeführt werden), ist die Verwendung numerischer Konstanten immer noch eine tragbarere Methode, um Hochleistungscode zu schreiben.

1362690cookie-checkWarum definiert math.h pi, pi/2, 2/pi, aber nicht 2*pi? [closed]

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy