J
Jarny
Stammgast
- 42
Hi
Ich hab mich heute mal ein bisschen mit Programmierung unter Android beschäftigt.
Unter anderem hab ich mir ein kleines Testprogramm geschrieben was sehr viele Fließkomma-Operationen ausführt. Ich benutze dabei ausschliesslich den Datentyp double.
Das Programm rechnet den Umfang der Erdkugel am Äquator aus indem ich 360000 mal kleine Teilstückchen aufsummiere. Die Teilstückchen berechnen sich aus einer sehr komplexen Formel (6 mal sin/cos Operationen, 1 mal arctan, 2 mal sqrt, 29 Multiplikationen, 7 Divisionen und ungezählte Additionen) pro Iteration!!!
Wie erwartet kommt bei der Berechnung 40075035m raus aber das interessante ist die Performance die ich gemessen habe. Gemessen wurde die reinen Berechnungen ohne Bildschirmausgabe:
Wie gesagt, die Berechnungen wurden in double-Genauigkeit durchgeführt und nicht in float (Gibts für float überhaupt ne Lib mit den Trigonometrische Funktionen?)
Was habt ihr denn so für Erfahrungen mit Fließkomma-Arithmetik gemacht? Sind die älteren Geräte wirklich so schwach bei Fließkommaberechnungen wie die c't schreibt? Evtl. kann mal jemand das Programm mit nem G1 oder Magic austesten.
Hier ist der Source:
Gruß
Jarny
Ich hab mich heute mal ein bisschen mit Programmierung unter Android beschäftigt.
Unter anderem hab ich mir ein kleines Testprogramm geschrieben was sehr viele Fließkomma-Operationen ausführt. Ich benutze dabei ausschliesslich den Datentyp double.
Das Programm rechnet den Umfang der Erdkugel am Äquator aus indem ich 360000 mal kleine Teilstückchen aufsummiere. Die Teilstückchen berechnen sich aus einer sehr komplexen Formel (6 mal sin/cos Operationen, 1 mal arctan, 2 mal sqrt, 29 Multiplikationen, 7 Divisionen und ungezählte Additionen) pro Iteration!!!
Wie erwartet kommt bei der Berechnung 40075035m raus aber das interessante ist die Performance die ich gemessen habe. Gemessen wurde die reinen Berechnungen ohne Bildschirmausgabe:
- Auf meinem Laptop (CoreDuo 1.6Ghz, 2 GByte) mit Java implementiert: 182ms
- Auf dem Emulator: 31104 ms
- Auf meinem Milestone: 4168 ms
Wie gesagt, die Berechnungen wurden in double-Genauigkeit durchgeführt und nicht in float (Gibts für float überhaupt ne Lib mit den Trigonometrische Funktionen?)
Was habt ihr denn so für Erfahrungen mit Fließkomma-Arithmetik gemacht? Sind die älteren Geräte wirklich so schwach bei Fließkommaberechnungen wie die c't schreibt? Evtl. kann mal jemand das Programm mit nem G1 oder Magic austesten.
Hier ist der Source:
Code:
package com.example.helloandroid;
import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;
public class HelloAndroid extends Activity {
/** fuer die Distanzberechnung */
static final double cdblRad = Math.PI / 180;
static final double cdblAbpl = 1 / 298.257223563; // Abplattung der Erde
static final double cdblAeq = 6378140; // Äquatorradius der Erde (m)
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
TextView tv = new TextView(this);
tv.setText("Hello world");
setContentView(tv);
double dStep = 0.001;
double dWinkel = 0.0;
double dStrecke = 0.0;
long lStart = System.currentTimeMillis();
for (int i = 0; i < 360000; i++) {
double dPrevWinkel = dWinkel;
dWinkel += dStep;
// Teilstrecke berechnen
double dTeilstrecke = calcDist(dPrevWinkel, 0, dWinkel, 0);
dStrecke += dTeilstrecke;
}
long lEnde = System.currentTimeMillis();
tv.setText("Zeit:" + (lEnde - lStart) + " millis");
}
public double calcDist(double dblLng1, double dblLat1, double dblLng2, double dblLat2) {
double b1 = dblLat1;
double l1 = dblLng1;
double b2 = dblLat2;
double l2 = dblLng2;
double F = (b1 + b2) / 2 * cdblRad;
double G = (b1 - b2) / 2 * cdblRad;
double l = (l1 - l2) / 2 * cdblRad;
double dblSinl = Math.sin(l);
double dblSinlq = dblSinl * dblSinl;
double dblCosl = Math.cos(l);
double dblCoslq = dblCosl * dblCosl;
double dblSinG = Math.sin(G);
double dblCosG = Math.cos(G);
double dblSinF = Math.sin(F);
double dblCosF = Math.cos(F);
double S = dblSinG * dblSinG * dblCoslq + dblCosF * dblCosF * dblSinlq;
double C = dblCosG * dblCosG * dblCoslq + dblSinF * dblSinF * dblSinlq;
double w = Math.atan(Math.sqrt(S / C));// in rad
if (w == 0.0)
return 0.0;
double R = Math.sqrt(S * C) / w;
double D = 2 * w * cdblAeq;
double H1 = (3 * R - 1) / (2 * C);
double H2 = (3 * R + 1) / (2 * S);
double s = D * (1 + cdblAbpl * H1 * dblSinF * dblSinF * dblCosG * dblCosG -
cdblAbpl * H2 * dblCosF * dblCosF * dblSinG * dblSinG);
return s;
}
}
Jarny