Solved

# pow(10,x) implementation!

Posted on 2003-11-03
1,791 Views
hi,

could anybody tell me, how can i implement pow(10,x) function, where x can be double? ofcourse, i want to minimize use of library functions to speedup the process?
0
Question by:Vikram_B
• 2
• 2
• 2

LVL 45

Expert Comment

here is the glibc implementation of pow() (which I would not strain to comprehend)

# define __TGMATH_BINARY_REAL_IMAG(Val1, Val2, Fct, Cfct) \
(__extension__ ({ __tgmath_real_type ((Val1) + (Val2)) __tgmres;            \
if ((sizeof (__real__ (Val1)) > sizeof (double)            \
|| sizeof (__real__ (Val2)) > sizeof (double))    \
&& __builtin_classify_type (__real__ (Val1)            \
+ __real__ (Val2))     \
== 8)                                    \
{                                          \
if (sizeof (__real__ (Val1)) == sizeof (Val1)      \
&& sizeof (__real__ (Val2)) == sizeof (Val2))  \
__tgmres = __tgml(Fct) (Val1, Val2);            \
else                                          \
__tgmres = __tgml(Cfct) (Val1, Val2);            \
}                                          \
else if (sizeof (__real__ (Val1)) == sizeof (double)   \
|| sizeof (__real__ (Val2)) == sizeof(double) \
|| (__builtin_classify_type (__real__ (Val1)) \
!= 8)                              \
|| (__builtin_classify_type (__real__ (Val2)) \
!= 8))                              \
{                                          \
if (sizeof (__real__ (Val1)) == sizeof (Val1)      \
&& sizeof (__real__ (Val2)) == sizeof (Val2))  \
__tgmres = Fct (Val1, Val2);                  \
else                                          \
__tgmres = Cfct (Val1, Val2);                  \
}                                          \
else                                          \
{                                          \
if (sizeof (__real__ (Val1)) == sizeof (Val1)      \
&& sizeof (__real__ (Val2)) == sizeof (Val2))  \
__tgmres = Fct##f (Val1, Val2);                  \
else                                          \
__tgmres = Cfct##f (Val1, Val2);                  \
}                                          \
__tgmres; }))

if you feel lost then there is always the simpler one

result = 1;
for ( i = 0;  i < x; i++ )
result = result  * 10;

;o)
0

LVL 45

Expert Comment

a little study shows that pow is implemented as a macro and not as a function... if you use pow(), your execution time would not be adversely affected... moreover, library implementation of pow() is bound to be more efficient what I or you would write... So I would say --- use pow()
0

Author Comment

life is not always straignt-forward. i'm implementing the pow function on a dsp chip (TI'x 64xx) which doesn't have floating pt unit. thus, using libraty pow function is consuming lotta cpu cycles.
0

LVL 5

Expert Comment

You might consider changing bases to either 2 or e by precomputing the logarithm of 10 for the desired base. Many systems have an optimized implementation for exponentiation base e, and base 2 can be done quickly for powers in binary form using the square and multiply method.

To transform the base to 2, use the identity:

10^x = (2^lg(10))^x = 2^(lg(10)*x)

where lg() is the logarithm base 2. Typically, you will need to compute log(10)/log(2) using a different base, but this is done only once and stored for later use, so efficiency is not important here. The transformation is similar for base e, but unless a built-in function exists for exponentiation base e, you should use base 2 for this.

So the idea is to compute r = log(10)/log(2) one time, either globally or offline, then find 2^(r*x).

-Seth
0

LVL 5

Accepted Solution

SethHoyt earned 50 total points
You can find the square and multiply method here:

http://www.math.ucalgary.ca/~kjell/papers/hardware/gordon98survey.pdf

-Seth
0

Author Comment

thanx SethHoyt,

that should work :)
0

## Featured Post

### Suggested Solutions

Have you thought about creating an iPhone application (app), but didn't even know where to get started? Here's how: ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ Important pre-programming comments: I’ve never tri…
Summary: This tutorial covers some basics of pointer, pointer arithmetic and function pointer. What is a pointer: A pointer is a variable which holds an address. This address might be address of another variable/address of devices/address of fu…
The goal of this video is to provide viewers with basic examples to understand recursion in the C programming language.
The goal of this video is to provide viewers with basic examples to understand how to create, access, and change arrays in the C programming language.