exp, log, sin, cos, tan und atan mit ordentlicher Argumentreduktion — dazu die Genauigkeitsvarianten expm1/log1p, die hyperbolischen Funktionen und den Zugriff auf die Exponentenebene.
→ Mathematik-Units · std.feq · std.math · std.complex
import std.mathx;
Schicht 1, hängt an std.feq, std.math und std.alloc. 29 Funktionen. Alle Beispiele mit lyxc 1.0.21A übersetzt und ausgeführt.
ExpF64 und LogF64 aus std.math tragen rund 1e−7 relativen Fehler — die halbe Genauigkeit, die f64 hergibt. Alles, was darauf aufbaut, erbt das: PowF64 (ist exp∘log), Gamma, sämtliche Verteilungen, Entropien.
Der Unterschied lässt sich nicht mit PrintF64 zeigen — sechs Nachkommastellen verdecken ihn. Über die Bitmuster ist er eindeutig:
unit main;
import std.io;
import std.string;
import std.math;
import std.feq;
import std.mathx;
fn ZB(t: pchar, v: f64): void { Print(t); PrintLn(IntToStr(FeqBits(v))); }
fn main(): int64 {
ZB("Bits MxLog(1000) : ", MxLog(1000.0));
ZB("Bits LogF64(1000) : ", LogF64(1000.0));
ZB("Bits MxExp(10) : ", MxExp(10.0));
ZB("Bits ExpF64(10) : ", ExpF64(10.0));
return 0;
}
Bits MxLog(1000) : 4619463459452485536
Bits LogF64(1000) : 4619463459373954948
Bits MxExp(10) : 4671783802770883936
Bits ExpF64(10) : 4671783802770877367
| Funktion | Abstand zum exakten Wert |
|---|---|
MxLog(1000) | 0 ULP — bitgenau |
LogF64(1000) | 78 530 588 ULP |
MxExp(10) | 0 ULP — bitgenau |
ExpF64(10) | 6 569 ULP |
Die Mx-Fassungen treffen das Bitmuster der Referenzrechnung exakt. Bei LogF64 liegen dazwischen über 78 Millionen darstellbare Zahlen.
Wo das zählt und wo nicht. Für eine Anzeige mit zwei Nachkommastellen ist 1e−7 belanglos. Sobald ein Ergebnis aber weiterverrechnet wird — Produkte vieler Logarithmen, Iterationen, Differenzen fast gleicher Werte —, wächst der Fehler mit. Eine Verteilungsfunktion, die intern zwanzig Malexpaufruft, hat am Ende keine sieben Stellen mehr.
MxSin und MxCos zerlegen π/2 in sechs 21-Bit-Stücke. Das klingt umständlich, ist aber der Grund, warum sie bei großen Argumenten noch etwas Sinnvolles liefern: bei sin(1e16) entscheidet die Genauigkeit der π/2-Darstellung darüber, welcher Punkt der Periode überhaupt getroffen wird.
SinF64ausstd.mathrechnet bei großen Argumenten falsch (#1537) —sin(1e16)ergibt dort 0,909 statt 0,780; bei 1e12 stimmen noch etwa vier Stellen. Zusätzlich ist die installierte Standardbibliothek veralteter als das Repository (#1578) und liefert fürSinF64(−6,282895)den Wert−11,89— außerhalb des Wertebereichs.
MxSin/MxCosumgehen beides und sind zugleich unabhängig davon, welche Fassung der Standardbibliothek installiert ist.
MxSinCos(x, sinAddr, cosAddr) rechnet beide auf einmal und spart die zweite Reduktion — bei Drehfaktoren und Koordinatentransformationen die günstigere Form.
Atan2F64achtet seit #1577 auf das Vorzeichen der Null — die Fallreihenfolge folgt C99 F.10.1.4,atan2(-0.0, -1.0)ergibt-π. Was bleibt, ist die Genauigkeit von etwa zehn Stellen; dafür gibt esMxAtan2.
Das Vorzeichen der Null ist kein Spitzfindigkeit: bei komplexen Verzweigungsschnitten und bei Winkeln nahe π entscheidet es darüber, ob das Ergebnis +π oder −π lautet.
var x: f64 := 0.000000001;
MxExpm1(x) // exp(x) - 1, ohne Auslöschung
MxLog1p(x) // log(1 + x), ohne Auslöschung
Bei kleinem x ist exp(x) fast genau 1. Die Differenz exp(x) − 1 löscht dann die führenden Stellen aus — von 16 Stellen bleiben bei x = 1e−9 noch etwa sieben. MxExpm1 rechnet die Differenz direkt und behält alle Stellen.
Das ist der Normalfall in der Zinsrechnung (kleine Zinssätze über kurze Zeiträume) und in der Wahrscheinlichkeitsrechnung (Wahrscheinlichkeiten nahe 0 oder 1).
| Gruppe | Funktionen |
|---|---|
| Exponential und Logarithmus | MxExp · MxLog · MxLog2 · MxLog10 · MxExp2 · MxExp10 · MxPow |
| Genauigkeitsvarianten | MxExpm1 · MxLog1p |
| Winkelfunktionen | MxSin · MxCos · MxTan · MxSinCos · MxAtan · MxAtan2 |
| Hyperbolisch | MxSinh · MxCosh · MxTanh · MxAsinh · MxAcosh · MxAtanh |
| Wurzeln und Reste | MxCbrt · MxFmod · MxRemainder |
| Exponentenebene | MxLdexp · MxFrexp · MxScalbn · MxCopySign · MxModf |
MxFmodundMxRemaindersind nicht dasselbe. Für7,5und2liefertMxFmodden Wert1,5— den Rest mit dem Vorzeichen des Dividenden, wie%bei Ganzzahlen.MxRemainderliefert−0,5: den Rest zum nächstgelegenen Vielfachen, also stets betragsmäßig höchstens die Hälfte des Divisors. Für Winkelnormalisierung istMxRemainderdie richtige Wahl, für „wie viel bleibt übrig„MxFmod.
Die Exponentenfunktionen arbeiten auf der Bitdarstellung: MxLdexp(x, n) multipliziert mit 2ⁿ ohne zu rechnen, MxFrexp zerlegt in Mantisse und Exponent, MxModf in Vor- und Nachkommateil.
Nicht alles im Bestand nutzt die genauen Fassungen.QuatExp,ProbLogGammaund die Verteilungen in std.prob rufen weiterhinExpF64/LogF64auf und erben deren 1e−7. Ebenso rechnenfft,tensor,autodiff,probundquatdie Winkelfunktionen überSinF64/CosF64— sie sind damit davon abhängig, welche Fassung der Standardbibliothek eingebunden ist. Eine Umstellung aufMxSinCosist vorgeschlagen, aber nicht entschieden.
Letzte Aktualisierung: 2026-08-16 · alle Beispiele mit lyxc 1.0.21A übersetzt und ausgeführt; die Genauigkeit über Bitmuster gegen eine unabhängige Referenzrechnung gemessen, nicht über die Textausgabe.