Re: New proposal for math.e

new topic     » goto parent     » topic index » view thread      » older message » newer message

Matt Lewis wrote:

> Juergen Luethje wrote:
> > 
> > This is my new proposal for a "math.e" standard include file,
> > according to the recent discussion on this forum.
> 
> <snip>
> 
> }}}
<eucode>
> global function log2 (object x)
>    -- logarithm base 2
>    -- in : (sequence of) real number(s) > 0
>    -- out: (sequence of) real number(s)
>    -- Note: This function returns _exact_ results for all integral
>    --       powers of 2 in the half-closed interval ]0,#FFFFFFFF]
> 
>    if atom(x) then
>       if x = #20000000 then
>          return 29
>       elsif x = #80000000 then
>          return 31
>       else 
>          return log(x)/LN2
>       end if
>    end if
> 
>    for i = 1 to length(x) do
>       x[i] = log2(x[i])
>    end for
>    return x
> end function
> </eucode>
{{{
 
> 
> I'm curious about the special treatment of #20000000 and #80000000 in log2.
> I assume that rounding errors give you imprecise answers?

Yes. When I wrote the function some time ago, only these two x values gave
me imprecise answers, so I was happy that there were not so many special
cases.

> However, I
> get the following imprecise results when taking out the special cases:
> }}}
<eucode>
> for i = 0 to 32 do
> 	printf(1, "%d: %0.16g\n", i & log2( power( 2, i ) ))
> end for
> </eucode>
{{{


[snipped list of values that contains 11 imprecise results]

I think I've found the answer. I have this function since a rather long
time in my private math library, and I copied it into the code proposed
for the Euphoria "math.e" file. In my original code which I had used for
testing, it read
   return log(x)/log(2)

Now, since we had
   constant LN2 = 0.6931471805599453

in "math.e" anyway, I thought it was a good idea to write
   return log(x)/LN2

instead. And as you showed here, that doesn't work as expected.

When I again use
   return log(x)/log(2)
in function log2(), then
for i = 0 to 32 do
	printf(1, "%d: %0.16g\n", i & log2( power( 2, i ) ))
end for

prints
0: 0
1: 1
2: 2
3: 3
4: 4
5: 5
6: 6
7: 7
8: 8
9: 9
10: 10
11: 11
12: 12
13: 13
14: 14
15: 15
16: 16
17: 17
18: 18
19: 19
20: 20
21: 21
22: 22
23: 23
24: 24
25: 25
26: 26
27: 27
28: 28
29: 29
30: 30
31: 31
32: 32

even when I take out the special cases!! smile
I can't exactly remember anymore, but probably I wrote and tested the
function log2() on my old PC (Windows 98, Pentium II processor).
Now I have Windows XP and a Centrino Duo Processor. Is it possible that
the new system makes disappear the imprecise results? At least I currently
have no other idea.

And since in this case it's much better to use log(2) rather than LN2,
maybe that means that it would be better not to provide such constants
in "math.e"? I'm sorry. I have more questions than answers. smile
Thanks for finding this.

Regards,
   Juergen

new topic     » goto parent     » topic index » view thread      » older message » newer message

Search



Quick Links

User menu

Not signed in.

Misc Menu