Forum: Offtopic Octave Ungenauigkeit


von Jan K. (jan_k)


Lesenswert?

Hi Leute,

bin gerade nach studenlangem Suchen nach dem Fehler meiner 2d DFT 
Implementation auf eine numerische Ungenauigkeit gestoßen, die alles 
kaputt gemacht hat.

Könnte von euch vielleicht mal jemand die Ausgaben von 
"exp(-i*2*pi*1*1./2)" in eurem Octave und bitte auch in Matlab (hab' ich 
nämlich nicht hier) posten? Ich bekomme sowas raus:
1
>>> exp(-i*2*pi*1*1./2)
2
ans = -1.00000000000000e+00 - 1.22460635382238e-16i

wie kann ich denn das am besten beheben?

von Stefan H. (Firma: dm2sh) (stefan_helmert)


Lesenswert?

Welche Genauigkeit brauchst du denn mindestens?

von Marek N. (Gast)


Lesenswert?

Gerne, Matlab:
1
  To get started, select MATLAB Help or Demos from the Help menu.
2
3
version
4
5
ans =
6
7
7.3.0.267 (R2006b)
8
9
>> exp(-i*2*pi*1*1./2)
10
11
ans =
12
13
  -1.0000 - 0.0000i
14
15
>>

von Purzel H. (hacky)


Lesenswert?

Mein Maple ergibt exp(-i*pi). Was soll's denn sein ?

Allenfalls den Turbo reinwerfen, sodass noch ein paar mehr Stellen 
rauskommen ?

von Marek N. (Gast)


Lesenswert?

Und Octave:
1
octave:3> version
2
ans = 3.0.0
3
octave:4> exp(-i*2*pi*1*1./2)
4
ans = -1.0000e+000 - 1.2246e-016i

von Jan K. (jan_k)


Lesenswert?

Witzig witzig,
1
>>> version
2
ans = 3.4.3
3
>>> exp(-i*pi)
4
ans = -1.00000000000000e+00 - 1.22460635382238e-16i

Es soll natürlich -1 rauskommen, meine benötigte Genauigkeit ist 
allerallerhöchstens E-6. Ich ging dennoch davon aus, dass Octave das 
berechnen kann - abgesehen von der Genauigkeit. Also nicht rein 
numerisch - hab ich mich offensichtlich vertan :D

Danke fürs Feedback

von Marek N. (Gast)


Lesenswert?

Scilab macht auch Murks:
1
-->ver
2
 ans  =
3
 
4
!Scilab Version:             5.3.3.1311149487                                         !
5
!                                                                                     !
6
!Operating System:           Windows XP 5.1                                           !
7
!                                                                                     !
8
!Java version :              1.6.0_18                                                 !
9
!                                                                                     !
10
!Java runtime information :  Java(TM) SE Runtime Environment (build 1.6.0_18-b07)     !
11
!                                                                                     !
12
!Java vm information :       Java HotSpot(TM) Client VM (build 16.0-b13, mixed mode)  !
13
!                                                                                     !
14
!Vendor specification:       Sun Microsystems Inc.                                    !
15
 
16
-->exp(-%i*2*%pi*1*1./2)
17
 ans  =
18
 
19
  - 1. - 1.225D-16i

von Florian R. (Firma: TU Wien) (frist)


Lesenswert?

...und was bekommt ihr so für exp(pi)-pi raus?

SCNR
Flo

von Jan K. (jan_k)


Lesenswert?

?? Wofür war das jetzt?

Aber mal ernsthaft, ich kann doch wohl von einem Mathematik Programm 
ausgehen, dass es sowas rechnen kann :
1
octave:16> cos(pi)
2
ans = -1
3
octave:17> sin(pi)
4
ans =  1.22460635382238e-16
5
octave:18> cos(pi/2)
6
ans =  6.12303176911189e-17

Oder etwa nicht?

von Florian R. (Firma: TU Wien) (frist)


Lesenswert?

Hallo Jan

> ?? Wofür war das jetzt?

Ich musste nur an das hier denken: http://xkcd.com/217/


Ansonsten hab ich nicht den Eindruck als würde irgendwer falsch rechnen.

In allen geposteten Beispielen wurde scheinbar mit ca. 16 (dezimalen) 
Stellen gerechnet, das wären dann Zahlen vom Type double. Da ist es doch 
kein wunder, dass nicht genau 0, sondern eben fast null, ca. 10^-16 
auskommt. Auch das Pi, mit dem die Rechunung als Eingabe begann, war ja 
nur auf ca. +/- 10^-16 genau angegeben, als double eben. Wenn man's 
genau wissen wollte warum und wieso müsste man sich eh die binäre 
Darstellung der Zahlen anschauen, z.B. hier: 
http://babbage.cs.qc.edu/IEEE-754/

In Mathematik 8 sie die Sache übrigens so aus:
1
In[39]:= $MachinePrecision
2
Out[39]= 15.9546
3
4
In[40]:= NumberForm[Evaluate[Exp[-I*2*Pi*1*1./2]], 20]
5
Out[40]=-1. -(1.2246467991473532x10^1-16)i
6
7
In[41]:= $MachineEpsilon 
8
Out[41]= 2.22045*10^-16
9
10
In[42]:= Chop[Exp[-I*2*Pi*1*1./2]]
11
Out[42]= -1.

Wie man sieht, mit 64bit floating points gerechnet, das gibt ca. 16 
Dezimalstellen. $MachineEpsilon ist übrigens die kleinste (in der 
gewählten Genauigkeit) darstellbare Differenz zu 1. Der Fehler ist 
kleiner, also alles OK, find ich.

Für das Problem, dass bei numerischer Berechnung z.B. ein Imaginärteil 
nicht wirklich weg fällt gibt's übrigens zumindest in Mathematica auch 
eine Lösung, siehe letzten beiden Zeilen.


Die oben gepostete Matlab Ausgabe ist übrigens wohl irreführend, weil 
die Zahlen gerundet ausgegeben wurden. Ich weiß grad nicht wie man die 
Ausgabe aller Stellen erzwingt, vielleicht mit "format long".

Grüße
Flo

von Florian R. (Firma: TU Wien) (frist)


Lesenswert?

... noch ein kleiner Nachtrag:

Der Fehler mit dem Pi`15.9546 (also Pi als 64bit float) behaftet ist ist 
übrigens ca. 1.2246467991473531772e-16. Sprich das ganze rumgerechne hat 
den Eingangsfehler nicht größer gemacht - was will man sich mehr 
wünschen.

Grüße
Flo

von Jan K. (jan_k)


Lesenswert?

Hey, danke für deine Ausführungen. Den Comic kannte ich noch nicht ;)

Bedeutet das denn nun, dass in den Matlab Ausgaben oben automatisch 
gerundet wird, sobald das Ergebnis kleiner ist als die Genauigkeit und 
bei octave eben nicht, oder wie kann man das deuten?

Ich meine, es ist ja schön, dass numerisch richtig gerechnet wird, ich 
als Benutzer kann aber mit den Zahlen, solange sie ungerundet bleiben 
nix anfangen.

Und ich habe gelernt, dass floor() bei sowas ganz böse ist, da wird aus 
-x*E-16 ganz schnell -1 :D

von Marek N. (Gast)


Lesenswert?

Viel schlimmer ist noch, dass exp(pi) ungefähr 23 ist! Ich vermute da 
die Illuminaten dahinter!

von j. c. (jesuschristus)


Lesenswert?

Matlabimaginärteil:
-1.2246e-016i

Genau das gleiche. Wenn sowas aber zu einem Fehler führt, liegt das 
Problem woanders.

von Jan K. (jan_k)


Lesenswert?

Wie gesagt, der eigentliche Fehler lag darin, dass ich zur besseren 
Übersicht in der Konsole die Matrix Elemente (falsch) gerundet habe, 
ohne mir vorher das echte Ergebnis angeguckt zu haben.

von Timm T. (Gast)


Lesenswert?


von j. c. (jesuschristus)


Lesenswert?

Dann überleg Dir mal den Unterschied zwischen Octave und Wolfram Alpha.

von Daniel -. (root)


Lesenswert?

noch ein Tipp:

Python
>>> "%.50f" % (0.1*3)
'0.30000000000000004440892098500626161694526672363281'

# perl -e 'printf("%.50f\n", 0.1*3)'
0.30000000000000004440892098500626161694526672363281

es gibt eben die numerische Mathematiksoftware und die symbolisch 
evaluirende wie Maxima

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.