2017-02-22 5 views
4

Aus irgendeinem Grund ist 2^52 gleich 2^52 + 1 in Matlab, aber warum? Und wie kann ich das beheben? Für weitere Informationen führen Sie bitte den folgenden Code aus und überprüfen Sie die Ergebnisse.Warum 2^52 ist gleich 2^52 + 1 in Matlab? Und wie man es repariert?

Hier ist es die Ausgänge (VPA):

>> format long 
>> digits(500) 
>> vpa(2^52) 

ans = 

4503599627370496.0 

>> vpa(2^52+1) 

ans = 

4503599627370496.0 

>> isequal(vpa(2^52), vpa(2^52+1)) 

ans = 

    1 

>> vpa(2^52+1) 

ans = 

4503599627370496.0 

>> ans+1 

ans = 

4503599627370497.0 

>> vpa(2^52+1000) 

ans = 

4503599627371496.0 

https://ibb.co/iDDAwF

(die Ausgänge ohne VPA)

>> 2^52 

ans = 

    4.503599627370496e+015 

>> 2^52+1 

ans = 

    4.503599627370497e+015 

>> isequal(2^52, 2^52+1) 

ans = 

    0 

>> 2^52+1 

ans = 

    4.503599627370497e+015 

>> ans+1 

ans = 

    4.503599627370498e+015 

>> 2^52+1000 

ans = 

    4.503599627371496e+015 

Edit: Dies ist kein Duplikat und hat nichts mit Gleitkommafehlern zu tun haben.

+0

Das ist seltsam. Ich habe nur alle Befehle in Matlab ausgeführt, die Sie in Ihrem Bild haben, und habe alle erwarteten Antworten erhalten. – RSon1234

+0

Bitte, posten Sie keine Bilder zum code. Es ist schwierig zu kopieren. Was ist dann 'vpa'? Mein Matlab hat es nicht. – Bernhard

+0

@Bernhard es ist Variable-Precision-Arithmetik – RSon1234

Antwort

7
vpa_item=vpa('2^52'); 
vpa_item2=vpa('1+2^52'); 
disp(isequal(vpa_item, vpa_item2)); 

Ergebnisse in 0

können "symbolic expressions" Nutzungsbeschränkungen von endlicher oder Gleitkommaarithmetik auf dem Eingangsende zu überbrücken.

--edit--

Die verlinkte Seite sagt vpa(1+sym(2)^52) der paradigmatische Ausdruck, obwohl sollten beide Methoden funktionieren.

Was nicht (im Allgemeinen) arbeiten, ist

value_affected_by_imprecise_arithemetic = 1+2^52; 
vpa(value_affected_by_imprecise_arithemetic) 
+0

Also wissen Sie, warum ich das richtige Ergebnis bekomme, wie das OP getan hat und das OP falsche Ergebnisse bekommt? – RSon1234

+0

@ RSon1234 Also, in R2015a 'isequal (vpa (2^52), vpa (2^52 + 1))' resultiert in '0', was das richtige Verhalten ist. Vielleicht wegen einer Versionskonflikt? idk ... – Mikhail

+0

@Michail Ich habe gerade 'isequal (vpa (num2str (2^52)), vpa (num2str (2^52 + 1)))' 'und es hat funktioniert, danke. – Kitiara

Verwandte Themen