MSP430 double genauigkeit

#5662847
Lesenswert?

Hallo,
weis jemand auf wieviel Nachkommastellen ich mit double beim 
MSP430FR59XX rechnen kann?
Als Entwicklungsumgebung verwende ich den IAR und habe dort schon double 
auf 64 bit gestellt.
Wenn ich nun z.B. einer  Variable den Wert -6.37853111E+00 zuweise, 
rundet er den Wert auf -6.378531109999999944.
Kann man wirklich nur auf 8 Nachkommastellen genau rechnen?

Danke für eure Hilfe
Frank
#5662887
Lesenswert?

Luther B. schrieb:
> Der Unterschied zwischen den beiden Werten beträgt
> .000000000000000056,
> d.h. tritt erst in der 17ten Nachkommastelle auf.
>
> "Ergebnis unterschiedet sich ab der X ten Stelle" bedeutet nicht "Auf X
> Nachkommastellen genau" - denn ansonsten wäre ja -6.378531110000000056
> "besser" als -6.378531109999999944.

ok, das stimmt natürlich.
Mein Problem ist, dass ich für meine Berechnung eine Polynomfunktion 3. 
Grades benötige und hier mit bis zu 16 Nachkommastellen genau rechnen 
müsste. Das Ergebnis ist dann leider zu ungenau. Gibt es denn irgend 
eine Möglichkeit mit dem MSP430 eine höhere Genauigkeit zu erreichen, 
hat hierzu jemand einen Tip?
#5662918
Lesenswert?

16 Nachkommastellen entsprechen 4nm auf den Erdradius berechnet - stimmt 
die Anforderung oder ist es ein Problem mit der Berechnung selbst, d.h. 
müssen z.B. viele sehr kleine auf wenige, viel größere Zahlen addiert 
werden? Das löst man meistens eher, in dem man die Berechnung umstellt 
und Werte verschiedener Größenordnung separat berechnet.

Falls das nichts hilft, musst du wohl versuchen eine Library für 
höheraufgelöste Zahlentypen auf dem MSP430 zum Laufen zu bringen. 
"decNumber" hat z.B. 128 Bit Dezimalzahlen mit 34 Stellen Genauigkeit:

http://speleotrove.com/decimal/decnumber.html
#5662933
Lesenswert?

ok danke, werde ich mir anschauen.

vielleich noch mal ein Beispiel meines Problemes.
Ich arbeite mit der Formel f = a*x3 + b*x2 + c*x + d
Als Werte gebe ich z.B. folgende ein:
x hat bei mir den Wert 48916, a=-7,18417038E-16, b=9,29568227E-11, 
c=3,31982246E-04 und d=-6,37853111E+00


Wenn ich jetzt meine Werte einsetze, bekomme ich z.B. beim MSP als 
Ergebnis 10.085. Rechne ich das gleiche mit Excel erhalte ich das 
gewünschte Ergebnis 10.000. Sicher kann ich nun nicht Excel auf einen PC 
mit dem MSP430 vergleichen.
Gast #5662967
Lesenswert?

Frank B. schrieb:
> ok danke, werde ich mir anschauen.
>
> vielleich noch mal ein Beispiel meines Problemes.
> Ich arbeite mit der Formel f = a*x3 + b*x2 + c*x + d
> Als Werte gebe ich z.B. folgende ein:
> x hat bei mir den Wert 48916, a=-7,18417038E-16, b=9,29568227E-11,
> c=3,31982246E-04 und d=-6,37853111E+00

Du könntest mal ein wenig im Internet recherchieren, denn das Problem 
tritt immer wieder auf.

Die Lösungen laufen daraus hinaus, die Gleichung, - insbesondere die 
Abfolge der Operationen -, und/oder die Darstellung der Zahlen so zu 
ändern (obwohl sie mathematisch identisch bleibt), dass der Fehler 
minimal wird.
Z.B.: Bleibt man bei der IEEE-Darstellung, so berechnet man Summen von 
Zahlen (ungefähr) gleicher Grössenordnung (also ähnlicher Mantisse).
Oder: Stellt man die Zahlen als Brüche von natürlichen Zahlen dar, so 
lassen sich meist Abfolgen der Operationen finden, bei denen die 
Zahlenbereich nicht verlassen werden - also das Ergebnis exakt ist.
Anderer Varianten sind die Zerlegung der Summanden und Faktoren wiederum 
in Summanden und Faktoren, die dann zunächst einzeln verrechnet werden.
Noch andere Varianten laufen auf Näherungsverfahren hinaus.

Das ist ein etwas umfangreicheres Feld und kann hier nicht vollständig 
abgedeckt werden.

Ich empfehle Dir, zunächst mal für jeden der Werte a, b, c, d, x und das 
Ergebnis f zu beschreiben, welchen Wertebereich sie haben und welche 
Auflösung.
#5662977
Lesenswert?

In seinem Fall ist der Fehler aber so nicht zu erklären. Wenn man es 
einfach so direkt macht:
1
#include <stdio.h>
2
int main()
3
{
4
typedef double real;
5
real x=48916; 
6
real a=-7.18417038E-16;
7
real b=9.29568227E-11;
8
real c=3.31982246E-04; 
9
real d=-6.37853111E+00;
10
real f=a*x*x*x+b*x*x+c*x+d; 
11
printf("%.15f\n",(double)f);
12
}

kommt 9.99905 raus. Aufm Raspberry-PI. Da liegt ein anderes Problem vor 
würde ich sagen.
Beitrag #5663020 wurde von einem Moderator gelöscht.
#5663031
Lesenswert?

Also erst mal danke für die Hilfe.
Durch die Antwort von luther-blissett ist mir mein Fehler klar geworden. 
Ich hatte die Berechnung in einzelnen Schritten gemacht, also erst a*x3 
und a*x2... einzeln gerechnet und dann die Ergebnisse addiert.
Das ist natürlich nicht so sinnvoll. Ich habe jetzt alles in eine Formel 
gepackt und schon geht es :)
Gast #5663058
Lesenswert?

Super, es geht, das hört man gern.

32 Bit float ist ungefähr 6 gültige Nachkommastellen, 64 Bit float ca. 
15, siehe auch
Beitrag "64 Bit float Emulator in C, IEEE754 compatibel"

Und man darf sich die Dynamik nicht versauen, also sollten die Zahlen in 
der gleichen Größenordnung liegen. Wenns nicht schon gehen würde würde 
aich als Rechnung auch empfehlen ((a*x+b)*x+c)*x+d

math rulez!
Cheers
Detlef

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren