Re: [Algorithms] approximation to pow(n,x)?
Brought to you by:
vexxed72
|
From: Robin G. <rob...@gm...> - 2009-11-04 14:47:44
|
Lack of coffee made be forget this - if you don't give a monkey's
about numerical accuracy and only want power-like curves, go right
ahead and use a fast exp() and log() to build your own power function.
Details of quick'n'dirty medium accuracy implementations are available
here:
http://www.research.scea.com/gdc2003/fast-math-functions.html
or in Game Programming Gems.
- Robin Green.
On Wed, Nov 4, 2009 at 6:32 AM, Robin Green <rob...@gm...> wrote:
> Your real problem is that the range of x is unconstrained. Looking at
> how pow() is calculated:
>
> pow(n,x) = exp(log(x)*n)
>
> You've simplified the exponent to exp(y+0) .. exp(y+1), but as y is
> unconstrained you've really gained nothing. The main problem with
> implementing pow() is that naive code can lose many digits of
> significance during the calculation if you don't calculate the log and
> multiply using extended precision, e.g. if you want a 24-bit result
> you'll need to calculate the intermediate values to 30 or more bits of
> accuracy. This is done by splitting the problem into a high part and a
> low part and combining the two at the reconstruction phase. For
> example, here's an implementation of powf():
>
> http://www.koders.com/c/fidF4B379CC08D80BEE9CD9B65E01302343E03BF4A7.aspx?s=Chebyshev
>
> The exp() is a great function to minimax as it only requires a few
> terms to approach 24-bit accuracy, but log() is a painfully different
> story often requiring table lookups (memory hits) to function well
> across the full number range.
>
> What are you using this for? If it's lighting or shading, there's no
> real reason to use a power function on the cosine term to get tighter
> specular highlights. It's just a shaping function that people use
> because it's easy to control and AFAICT it has no physical basis in
> defining a BRDF from the micropolygon point of view.
>
> - Robin Green.
>
> On Tue, Nov 3, 2009 at 7:45 PM, Juan Linietsky <re...@gm...> wrote:
>> Hi guys! I was wondering if there are fast ways to approximate the
>> curve resulting from pow(n,x) where n is in range [0..1] and x > 0
>> using only floating point (without strange pointer casts/etc)..
>>
>> Cheers
>>
>> Juan Linietsky
>
|