Re: what's the ULP in Octave

Kai Torben Ohlhus <[email protected]>
Newsgroups gmane.comp.gnu.octave.general
Message-ID <[email protected]>
 >> On Dec 1, 2020, at 7:55 AM, 康 珊 <[email protected]> wrote:
 >>
 >> Hi,
 >> I wonder what's the ULP(unit of least precision) for those double 
operations such as pow in octave.


On 12/2/20 6:01 AM, Victor Norton via Help-octave wrote:
 > Try this
 >    octave> x = 1; eps = 1;
 >    octave> while(x + eps > x)
 >    > eps /= 10;
 >    > end
 >    octave> eps
 >    eps =    1.0000e-16
 > Is this the answer?
 >


There is one important change necessary.  Octave's double is binary not 
decimal [1,2], thus it should be "eps /= 2;".  Otherwise the program 
will give the correct answer.

However, there is an Octave function called "eps" [3] which gives the 
result as well.  No need to write own code, but for clarification it can 
be beneficial to run some code.

```````````````````````````````````````````````
x = 1;
e = 1;
i = 0;
while (x + e > x)
   printf ("1 + 2^(%3d) = %s\n", ...
           i, num2hex (x + e))
   e /= 2;
   i--;
endwhile
printf ("1 + 2^(%3d) = %s  <-- 'e' too small\n", ...
         i, num2hex (x + e))
```````````````````````````````````````````````

The output gives a hexadecimal representation of double numbers "1.0 + 
e" for shrinking values of "e":

1 + 2^(  0) = 4000000000000000
1 + 2^( -1) = 3ff8000000000000
1 + 2^( -2) = 3ff4000000000000
     ...
1 + 2^(-51) = 3ff0000000000002
1 + 2^(-52) = 3ff0000000000001
1 + 2^(-53) = 3ff0000000000000  <-- 'e' too small

Thus:

- 2^(-52) == eps() (approx. "2.2204e-16") is the smallest number that 
can be added to "1.0" to "change" this number (the ULP unit in the last 
place).

- 2^(-53) == eps()/2 (approx. "1.1102e-16") is the number that added to 
1.0 is too small to "change" this number.  The precision of double is 
not enough to store the exact result of this addition.

A final note: eps() is *relative* to 1.0.  To obtain eps relative to 
another double number, say 5.0, call "eps (5.0) == eps() * 4 == 2^(-50)"

HTH,
Kai


[1] https://en.wikipedia.org/wiki/Unit_in_the_last_place
[2] https://en.wikipedia.org/wiki/Double-precision_floating-point_format
[3] https://www.octave.org/doc/v6.1.0/XREFeps.html
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.