CHDK inside

  • Schrift vergrößern
  • Standard-Schriftgröße
  • Schriftgröße verkleinern
Start CHDK inside Lua wissenschaftliche Funktionen


wissenschaftliche Funktionen

Drucken PDF

CHDK, Lua und wissenschaftliche mathematische Funktionen

Dank rudi aus dem deutschen CHDK-Forum ist es nun auch in CHDK-Lua-Skripten möglich, wissenschaftliche mathematische Funktionen zu verwenden, obwohl man in CHDK-Skripten nur Ganzzahlen ( Integer) verarbeiten kann.

Insbesondere die Integration der Winkelfunktionen stellt ein großes Problem dar. Hier wurde der CORDIC-Algorithmus verwendet. Andere Funktionen basieren auf der C-Bibliothek für mathematische Funktionen.

Die neue Lua-Bibliothek hat den Namen imath bekommen.

Alle Berechnungen erfolgen mit um 10^3 erweiterten Werten, welche damit drei Nachkommastellen repräsentieren. Intern arbeitet die Bibliothek mit vier Nachkommastellen. Weiterhin wurde die übliche Winkelangabe im Bogenmaß durch das Gradmaß ersetzt, was die Berechnung um mehr als eine Nachkommastelle verbessert. Der Genauigkeit wirken die üblichen Probleme mit der Umrechnung zwischen Dezimal- und Dualsystem entgegen.

Zusätzlich zu den mathematischen Funktionen gehören auch Hilfsfunktionen, die dezimale Operatioen bei Multiplikation und Division erleichtern.

Nachfolgend ein Überblick aller verfügbaren Funktionen sowie deren Wertebereiche:

Lua imath Bibliothek - Ganzzahlberechnugen mit 3 Nachkommastellen durch Erweiterung mit 1000
    Hinweis zur Darstellung: ' = kennzeichnet das gedachte Komma
 
Konstanten
imath.scale = 1'000         alle Werte sind um 1000 erweitert um 3 Nachkommastellen darzustellen
imath.pi2   = 6'283         2*PI
imath.pi    = 3'142         PI
imath.pi_2  = 1'571         PI/2
 
Hilfsfunktionen
x = imath.muldiv(a, b, c)   -2147352'576 <= x, a, b, c <= 2147352'576; c<>0; x=(a x b / c)
x = imath.mul(a, b)         -2147352'576 <= x, a, b <= 2147352'576; x=(a x b)
x = imath.div(a, c)         -2147352'576 <= x, a, c <= 2147352'576; c<>0; x=(a / c)
 
Umwandlungen
res = imath.rad(x)          -16383'999 <= x <= 16383'999; -285'938 <= res <= 285'938
res = imath.deg(x)          -285'938 <= x <= 285'938; -16383'999 <= res <= 16383'999
 
Winkelfunktionen für Bogenmaß (RAD)
x = imath.sinr(phi)         -16383'999 <= phi <= 16383'999; -1'000 <= x <= 1'000
x = imath.cosr(phi)         -16383'999 <= phi <= 16383'999; -1'000 <= x <= 1'000
x = imath.tanr(phi)         -16383'999 <= phi <= 16383'999; -5698'696 <= x <= 2674'857;
                            phi=PI/2 oder 3*PI/2 -> x<>Unendlich [tanr(PI/2)=-5698'696, tanr(3*PI/2)=2674'857]
phi = imath.asinr(x)        -1'000 <= x <= 1'000; -PI/2 <= phi <= PI/2
phi = imath.acosr(x)        -1'000 <= x <= 1'000; 0 <= phi <= PI
phi = imath.atanr(x)        -7035'005 <= x <= 7035'005; -PI/2 <= phi <= PI/2
r, theta = imath.polr(x, y) -7035'005 <= x, y <= 7035'005; 0 < r <= 9948'767 (0 = Überlauf); -PI/2 <= theta <= PI/2
x, y = imath.recr(r, theta) -16383'999 <= r, theta, x, y <= 16383'999; r<>0
 
Winkelfunktionen für Grad (DEG)
x = imath.sind(phi)         -16383'999 <= phi <=16383'999; -1'000 <= x <= 1'000
x = imath.cosd(phi)         -16383'999 <= phi <=16383'999; -1'000 <= x <= 1'000
x = imath.tand(phi)         -16383'999 <= phi <=16383'999; -16383'000 <= x <= 16383'000;
                            phi=90'000 oder 270'000 -> x<>Unendlich [tand(90'000|270'000)=-16383'000]
phi = imath.asind(x)        -1'000 <= x <= 1'000; -90'000 <= phi <= 90'000
phi = imath.acosd(x)        -1'000 <= x <= 1'000, 0 <= phi <= 180'000
phi = imath.atand(x)        -7035'005 <= x <= 7035'005; phi = -90'000 <= phi <= 90'000
r, theta = imath.pold(x, y) -7035'005 <= x, y <= 7035'005; 0 < r <= 9948'767 (0 = Überlauf); -90'000 <= theta <= 90'000
x, y = imath.recd(r, theta) -16383'999 <= r, theta, x, y <= 16383'999; r<>0
 
zusätzliche Funktionen
res = imath.pow(x, y)       -16383'000 <= x^y <= 16383'000
res = imath.log(x)          0 < x <= 16383'999; 0 <= res <= 9'704
res = imath.log2(x)         0 < x <= 16384'000; 0 <= res <= 14'000
res = imath.log10(x)        0 < x <= 16383'999; 0 <= res <= 4'214
res = imath.sqrt(x)         0 <= x <= 16384'000; 0 <= res <= 128'000

 

 

Anmeldung

Wer ist online?

Wir haben 20 Gäste online