Re: [LAU] OT(ish): Strange coding problem (audio related)

From: Philipp Überbacher <hollunder@email-addr-hidden>
Date: Sat Jan 29 2011 - 13:07:12 EET

Excerpts from fons's message of 2011-01-28 16:11:52 +0100:
> On Fri, Jan 28, 2011 at 02:02:36PM +0100, Philipp Überbacher wrote:
>
> > rant_begin
> > Why can't log mean the same thing everywhere? Why does it need to be
> > base e here and base 10 there? Why is there no consistency?
> > And why is there no proper logarithmus dualis function? Because you
> > can simply do log(n)/log(2)? We've just seen how well this works.
> > How about:
> > log() - base 10
> > ln() - base e - logarithmus naturalis
> > ld() - base 2 - logarithmus dualis
> > rant_end
>
> Libm has log(), log10, and log2().

Took me a while to figure out that libm is part of glibc :)
Good to know that those functions are available on probably pretty much
all linux systems.

> > The next obvious question is: Does the inaccuracy reliably result in
> > values bigger than 11?
>
> No.
>
> If the input is a power of two, and you expect an integer as
> a result, just do
>
> k = (int)(log2(x) + 1e-6)

log2() suffers from the same problem? I somewhat dislike the idea of
adding a constant.

> or
>
> k = (int)(log(x)/log(2) + 1e-6)
>
> or
>
> int m, k;
> for (k = 0, m = 1; m < x; k++, m <<= 1);
>
> which will round up if x is not a power of 2.

Neat. I thought about it myself yesterday but my ideas weren't exactly
brilliant. One idea was to divide by 2, the other to use a small
lookup table for powers of 2. I don't really know about efficiency, but
I guess bit shifting is as efficient as it gets?
Anyway, it's a neat way to avoid the problem and the rounding properties
of mult/div in case of not power of 2 could be useful as well.

Regards,
Philipp

_______________________________________________
Linux-audio-user mailing list
Linux-audio-user@lists.linuxaudio.org
http://lists.linuxaudio.org/listinfo/linux-audio-user
Received on Sat Jan 29 16:15:01 2011

This archive was generated by hypermail 2.1.8 : Sat Jan 29 2011 - 16:15:01 EET