Large Integer problem
31 Ansichten (letzte 30 Tage)
Ältere Kommentare anzeigen
deniz kartan am 3 Mär. 2011
Kommentiert: Walter Roberson am 14 Jan. 2016
Hi, I am getting these strange results:
Equations are of the form (x*y + n) - x*y which has the obvious result n. But Matlab gives strange results. These are the results I get in Matlab 2007 and 2010a:
(1812433253*19650218 + 1) - (1812433253*19650218) = 0
(1812433253*19650218 + 2) - (1812433253*19650218) = 0
(1812433253*19650218 + 3) - (1812433253*19650218) = 4
I realized that 1812433253*19650218 has more than 53 bits and these results has something to do with the way Matlab handles numbers between 53 bits and 64 bits. But I couldn't find a reliable way to carry out above operations correctly. Thanks.
Sean de Wolski am 3 Mär. 2011
John D'Errico's vpi on the file exchange: http://www.mathworks.com/matlabcentral/fileexchange/22725-variable-precision-integer-arithmetic
Weitere Antworten (3)
You are seeing the results of the limitations of floating point arithmetic.
Read this if you plan on using MATLAB much:
You can see what is going on by looking at this:
N = 1812433253*19650218;
This means that whenever you add a number greater than eps/2 to N, the result is represented as the next largest number available, N+eps(N). Then it will make sense that:
N + eps(N) - N % Equals eps(N)
Conversely, whenever you add a number smaller than eps(N)/2 to N, the result is represented as N. So it makes sense that
N + eps(N)/3 - N % eps(N)/3 is less than eps(N)/2.
I recommend thoroughly understanding this because it is the same thing for non-integers.
the cyclist am 3 Mär. 2011
I recommend John D'Errico's "Variable Precision Integer" code from the FEX:
Michelle Hirsch am 13 Jan. 2016
I'm 5 years late to the party, but another lightweight way to address this specific behavior is to force the variables to be int64 (or uint64), which can express integer values larger than 2^53.
>>(int64(1812433253*19650218) + 1) - int64(1812433253*19650218)
Walter Roberson am 14 Jan. 2016
There are also some things that cannot be done with int64 or uint64. Like bin2dec() into one of them, or get a correct dec2bin()
>> dec2bin((uint64(2^33)^2) - uint64(1023))
>> dec2bin((uint64(2^33)^2) - uint64(1024))
dec2bin() converts to double() before it does the conversion to bits, which is a waste of computation power.
Find more on Logical in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!Start Hunting!