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
:
Bearbeitet durch User
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.
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?
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
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.
Das ist ja katastrophal daneben! Ich bekomme unter armhf 9.999050090800253 raus und das ist einigermaßen am richtigen Ergebnis dran (9.99905091456285793184...). Kannst du mal zeigen, wie du das Polynom berechnest?
:
Bearbeitet durch User
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.
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.
Luther B. schrieb: > In seinem Fall ist der Fehler aber so nicht zu erklären. > [...] Nun gut. Du kommst auf ein anderes Ergebnis. Interessant wäre noch die Bitanzahl von double auf dem jeweiligen System.
Luther B. schrieb: > In seinem Fall ist der Fehler aber so nicht zu erklären. Seh ich auch so, sogar auf nem AVR, der nur float kann und double gar nicht kennt, kommt da 9.99905 raus was ja wesentlich besser ist als die 10.085. Da hat man doch woanders nen Bock geschossen...
Beitrag #5663020 wurde von einem Moderator gelöscht.
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 :)
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
Detlef _A schrieb: > Wenns nicht schon gehen würde würde aich > als Rechnung auch empfehlen ((a*x+b)*x+c)*x+d Richtig: Horner-Schema.
Computergerecht Rechnen ist eine Vorlesung fuer sich. Von selbst ist da gar nichts.
Name H. schrieb: > Computergerecht Rechnen ist eine Vorlesung fuer sich. Von selbst ist da > gar nichts. Wieso sollte auch, der Computer ist dumm wie Brot, woher sollte der Wissen was Mensch will? ;)
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.