Forum: Compiler & IDEs MSPGCC : Double , long double


von KF26046 (Gast)


Lesenswert?

Wo kann ich den bitte die Beschreibung der bei MSPGCC verfügbaren
Zahlenformate finden? Irgendwie finde ich nix.

Mir reicht double nicht aus und ich wollte long double benutzen.
Der Compiler nimmt es, aber irgendwie geht es damit aber auch nicht
besser. Kann eigentlich keinen Unterschied feststellen.

von Mars (Gast)


Lesenswert?


von KF26046 (Gast)


Lesenswert?

Danke, ist ja schon mal ganz gut.

Aber es müsste doch auch was mit double geben. Der Compiler
meckert nicht. Selbst bei long double. Oder übersehe ich da was ?

von KF26046 (Gast)


Lesenswert?

Muss mich insofern berichtigen: double würde mir reichen, wenn es
gehen würde.

Ich sehe keinen Unterschied zwischen float, double und long double.
Der Compiler "frisst" aber alles. Das Ergebnis ist immer nur 8 stellig
hinter dem Komma. Wobei bei 7 Stellen nach dem Komma schon 
Rundungsfehler
auftreten (wenn ich richtig sehe). Ich bräuchte aber mindesten 14 
Stellen
hinter dem Komma.

In float.h gibt's was mit DBL und LDBL!

Hat jemand eine Idee dazu ?

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Schaue in die Quellen, die lügen nicht ;-) und zwar nach
  gcc/config/msp430/msp430.h
in
  http://mspgcc.git.sourceforge.net/git/gitweb.cgi?p=mspgcc/mspgcc;a=tree;

Da steht:

#define SHORT_TYPE_SIZE 16
#define LONG_TYPE_SIZE 32
#define LONG_LONG_TYPE_SIZE 64
#define FLOAT_TYPE_SIZE 32
#define DOUBLE_TYPE_SIZE FLOAT_TYPE_SIZE
#define LONG_DOUBLE_TYPE_SIZE FLOAT_TYPE_SIZE
#define DEFAULT_SIGNED_CHAR 1

Die Interpretation des Orakels überlass ich dir...

von KF26046 (Gast)


Lesenswert?

Ok, danke. Das erklärt wohl warum immer Float-Genauigkeit rauskommt.

Eigentlich will ich "nur" die Distanz zwischen zwei geograph.-
Koordinaten berechnen. Hatte sowas schon mal mit einem ARM (GNUARM)
gemacht, da ging alles problemlos.
Die Genauigkeit der Berechnungen habe ich wohl beim MSPGCC übersehen.
Oft braucht man es da ja eigentlich auch nicht.

Jetzt habe ich ein Problem mehr!!

von h_ (Gast)


Lesenswert?

Hallo,

benutz doch GMP/MPFR.

von KF26046 (Gast)


Lesenswert?

Aha, habe noch nie was davon gehört! Interessant!

Wo finde ich Infos was ich tun muss um MPFR mit MSPGCC zu nutzen ?
In der Docu steht  was von Linux Installation. Vermutlich setlle
ich mich nur zu blöde an.

Danke.

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

KF26046 schrieb:

> Wo finde ich Infos was ich tun muss um MPFR mit MSPGCC zu nutzen ?
> In der Docu steht  was von Linux Installation. Vermutlich setlle
> ich mich nur zu blöde an.

Du willst auf MSP430 keine Linux-Libs nutzen ;-)

D.h. du musst dir eine Version für MSP430 selber cross-generieren oder 
fertige Builds irgendwo zusammensuchen.

config.sub erwähnt immerhin msp430, d.h. einfach configure --help und 
dann sowas wie

$ ../foo-source/configure --target=msp430 --enable-static 
--disable-shared --prefix=...

versuchen. Ein Blick ins erzeugte config.log kann auch hilfreich sein um 
sicherzustellen, daß die gewünschten cross-Tools genommen werden.

Minsestausstattung ist eine funktionierende und installierte 
msp430-Toolchain, zudem make, sed, awk, rm. test, und das ganze 
*nix-Geraffel.

von Klaus (Gast)


Lesenswert?

KF26046 schrieb:
> Ich bräuchte aber mindesten 14 Stellen

Die Entfernung Erde - Mond in mm ?

MfG Klaus

von KF26046 (Gast)


Lesenswert?

Johann L. schrieb:
> D.h. du musst dir eine Version für MSP430 selber cross-generieren oder
> fertige Builds irgendwo zusammensuchen.

Johann, da wäre ich total überfordert. Bin froh wenn ich mit MSPGCC und
Eclipse zurecht kommen. Gibt's nicht irgendwo eine Anleitung was man im
Detail machen muss oder ein fertiges Paket und Bezugsquellen ?

Danke

von Klaus W. (mfgkw)


Lesenswert?

KF26046 schrieb:
> Eigentlich will ich "nur" die Distanz zwischen zwei geograph.-
> Koordinaten berechnen. Hatte sowas schon mal mit einem ARM (GNUARM)
> gemacht, da ging alles problemlos.

Überlege dir, was du wirklich brauchst und rechne dann in ganzen Zahlen 
(ggf. skaliert nennt es sich dann Festkommazahl).

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Sind λ geographische Länge und ϕ geographische Breite, dann ist die 
Entfernung, angegeben im Bogenmaß
 

Das von Hand nach Fixedpoint zu klöppeln mach echt keinen Spaß...

von Klaus W. (mfgkw)


Lesenswert?

Man wächst mit den Herausforderungen :-)

von Klaus W. (mfgkw)


Lesenswert?

Aber im Ernst: auch Winkelfunktionen kann man aus Tabellen linear 
interpolieren.
Und die Tabellen muß man nicht mit dem Taschenrechner erstellen, sondern 
kann sie auf dem PC rechnen lassen und als Quelltextfragment ausgeben.

von KF26046 (Gast)


Lesenswert?

Vorschlag bitte wie SIN, COS , ARCCOS mit ganzen Zahlen ?

Keine gute Idde!

von Klaus W. (mfgkw)


Lesenswert?

KF26046 schrieb:
> Vorschlag bitte wie SIN, COS , ARCCOS mit ganzen Zahlen ?

Das mit dem Skalieren überlesen?
Wenn du etwas Milch brauchst und eine Kuh zu viel ist, dann kann man 
auch einen Liter Milch nehmen oder noch kleinere Dosen.

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Klaus Wachtler schrieb:
> Aber im Ernst: auch Winkelfunktionen kann man aus Tabellen linear
> interpolieren.

*hüstel* 

Bei auch nur annähernd der geforterten Genauigkeit?

Und arccos hat Singularitäten, d.h. man brauch mindestens 2 Formeln.
Also neben arccos vermutlich noch arcsin; je nach Wertebereich des 
Arguments.

von Klaus W. (mfgkw)


Lesenswert?

Johann L. schrieb:
> Bei auch nur annähernd der geforterten Genauigkeit?

Das kannst du steuern mit der Feinheit der Tabellen.
Gleitkommazahlen haben ja auch keine unendliche Genauigkeit, sondern 6-7 
Stellen (dezimal) bei float und ca. 13 bei double.
Bei glatten Verläufen kommt man da mit linearer Interpolation auch 
schnell hin.

>
> Und arccos hat Singularitäten, d.h. man brauch mindetsend 2 Formeln.
> Also neben arccos vermutlich noch arcsin; je nach Wertebereich des
> Arguments.

In der Nähe der Sing. hast du in diesem Fall wahrscheinlich eh etwas 
falsch gemacht, und mit float auch wieder nichts gewonnen.

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Klaus Wachtler schrieb:
> Johann L. schrieb:
>> Bei auch nur annähernd der geforterten Genauigkeit?
>
> Das kannst du steuern mit der Feinheit der Tabellen. [...]
> Bei glatten Verläufen kommt man da mit linearer Interpolation auch
> schnell hin.

Schnell? Bei linearer Interpolation ist die geht die Anzahl der 
Stützstellen umgekehrt proportional mit der geforterten Genauigkeit 
(falls die Funktionen wie hier stückweise gutmütig sind).

Selbst wenn "nur" die Genauigkeit von float nachgebildet werden soll, 
ist man in bei Hausnummern von 1E6 oder mehr.

Ich bin ja nicht mit MSP430 befasst, aber der Ansatz taucht einfach 
nicht.

Bei Approximationen höhrer Ordnung spart man deutlich an Speicherplatz; 
die Genauigkeit geht umgekehrt proportional mit der entsprechenden 
Potenz der Stützstellen, bei 3-er Ordnung also grob einige 100 Punkte 
für Genauigkeit im ppm-Bereich.

Aus naheliegenden Gründen ist Potenzreihenentwicklung ungeeignet.
Praktikabel ist zum Beispiel nach Bernsteinpolynomen zu entwickeln.

Die Crux ist dann nicht mehr die Auswertung, sondern die Berechnung der 
Polynome bzw. der Stütz- und Kontrollpunkte. Das geschieht zwar auf 
einem PC, dadurch wird die Aufgabe aber nicht weniger schwierig. Wenn 
man nämlich keine vernünftigen Punkte berechnet, geht die Genauigkeit 
nicht mehr nach der obigen Faustformel.

>> Und arccos hat Singularitäten, d.h. man brauch mindetsend 2 Formeln.
>> Also neben arccos vermutlich noch arcsin; je nach Wertebereich des
>> Arguments.
>
> In der Nähe der Sing. hast du in diesem Fall wahrscheinlich eh etwas
> falsch gemacht, ...

Nö, man hat nix falsch gemacht.

Berechne einfach arccos(x) mit x = 1 und wackle ein gaaanz klein wenig 
an x und schau was passiert!

> ... und mit float auch wieder nichts gewonnen.

Jo, das stimmt allerdings.

von Klaus W. (mfgkw)


Lesenswert?

Johann L. schrieb:
> Schnell? Bei linearer Interpolation ist die geht die Anzahl der
> Stützstellen umgekehrt proportional mit der geforterten Genauigkeit
> (falls die Funktionen wie hier stückweise gutmütig sind).
>
> Selbst wenn "nur" die Genauigkeit von float nachgebildet werden soll,
> ist man in bei Hausnummern von 1E6 oder mehr.

1. Nein. Bei den glatten Winkelfunktionen kommt man mit ein paar Hundert 
Stützstellen auf beachtliche Genauigkeiten.
Wenn du es nicht glaubst, kann ich dir gerne ein paar 
Vergleichsrechnungen machen.

2. ROM ist i.d.R. billig, und selbst ein paar Hundert Einträge im Flash 
bedeuten ja nicht, daß damit die Suchzeit linear ansteigt.
Entweder hat man eine feste Stützweite und kann sich aus dem Argument 
gleich die Stützstellen holen (O(1)), oder man nimmt im schlimmsten Fall 
binäre Suche (wenn man keine äquidistanten Stützstellen hat).

Johann L. schrieb:
> Nö, man hat nix falsch gemacht.
>
> Berechne einfach arccos(x) mit x = 1 und wackle ein gaaanz klein wenig
> an x und schau was passiert!

Wenn du aus einem Argument nahe bei 1 einen genauen Winkel berechnen 
willst, hast du etwas falsch gemacht.
Egal, mit welcher Genauigkeit du mit Gleitkommazahlen rechnest.

Da die Krümmung hier sehr gering ist, macht man mit Interpolation auch 
nichts mehr verkehrt.

Das Problem mit asin(etwa 1) kommt aus der Steigung in diesem Bereich. 
lineare Interpolation ist aber nur schlecht bei starker Krümmung - und 
die ist in keinem der hier gezeigten Fälle groß.

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Klaus Wachtler schrieb:
> Johann L. schrieb:
>> Schnell? Bei linearer Interpolation ist die geht die Anzahl der
>> Stützstellen umgekehrt proportional mit der geforterten Genauigkeit
>> (falls die Funktionen wie hier stückweise gutmütig sind).
>>
>> Selbst wenn "nur" die Genauigkeit von float nachgebildet werden soll,
>> ist man in bei Hausnummern von 1E6 oder mehr.
>
> 1. Nein. Bei den glatten Winkelfunktionen kommt man mit ein paar
> Hundert Stützstellen auf beachtliche Genauigkeiten.
> Wenn du es nicht glaubst, kann ich dir gerne ein paar
> Vergleichsrechnungen machen.

Peinlich. Anstatt meiner falschen Intuition zu folgen, hätte ich einfach 
nur in meinem eigenen Artikel anschauen müssen, wo die Abschätzung 
ausgeführt ist :-(

http://www.mikrocontroller.net/articles/AVR_Arithmetik/Sinus_und_Cosinus_(Lineare_Interpolation)#Aufbau_der_Tabelle

> Johann L. schrieb:
>> Nö, man hat nix falsch gemacht.
>>
>> Berechne einfach arccos(x) mit x = 1 und wackle ein gaaanz klein wenig
>> an x und schau was passiert!
>
> Wenn du aus einem Argument nahe bei 1 einen genauen Winkel berechnen
> willst, hast du etwas falsch gemacht.
> Egal, mit welcher Genauigkeit du mit Gleitkommazahlen rechnest.
>
> Da die Krümmung hier sehr gering ist, macht man mit Interpolation auch
> nichts mehr verkehrt.

Krümmung ist was anderes als 2-te Ableitung.

> Das Problem mit asin(etwa 1) kommt aus der Steigung in diesem Bereich.
> lineare Interpolation ist aber nur schlecht bei starker Krümmung - und
> die ist in keinem der hier gezeigten Fälle groß.

Sieht nochmal die verlinkte Rechnung. Dort steht nicht die geometrische 
Krümmung (Curvature) sondern die 2-te und 3-te Ableitung, und die sind 
nicht beschränkt.

Aber das Thenma ist eh durch — wie gesagt braucht man für den Bereich ne 
andere, angepasste Formel.

von Karl H. (kbuchegg)


Lesenswert?

KF26046 schrieb:

> Eigentlich will ich "nur" die Distanz zwischen zwei geograph.-
> Koordinaten berechnen.

Was soll es denn werden? Autopilot, der es über den Atlantik schafft?
Für alles im Umkreis von einigen Zig-Kilometern kannst du auch bei 
annehmbarer Genauigkeit annehmen, dass die Erde flach ist, sprich 
kartesisch rechnen.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.