Hello,
I'd like to make a simple replacement of 'pow()' function for the embedded
platform I'm working on. What is the better way, probably bit shifting?
Thanks.
Best regards, Roman Mashak. 15 7336
Roman Mashak wrote, On 14/12/07 00:43:
Hello,
I'd like to make a simple replacement of 'pow()' function for the embedded
platform I'm working on. What is the better way, probably bit shifting?
Thanks.
It all depends on the details of your requirements, including whether
speed, accuracy or space is more important and on the limits for each. I
know of code that uses a small lookuptable for trig functions, one
that leads to a lot of inaccuracy but it "good enough", fast and small.
I know other code that uses a lookuptable and interpolation of some
form (I never checked the details) because speed was a bit less
important (the processor was faster).

Flash Gordon
Roman Mashak wrote:
>
Hello,
I'd like to make a simple replacement of 'pow()'
function for the embedded platform I'm working on.
/* BEGIN fs_pow_test.c */
#include <stdio.h>
/*
** fs_pow is implemented in portable freestanding code
*/
#include "fs_pow.h"
int main(void)
{
puts("/* BEGIN fs_pow_test.c output */\n");
printf("fs_pow(2, 4) is %f\n\n",
fs_pow(2, 4));
printf("fs_pow(0.0001, 0.25)  10 is %e\n\n",
fs_pow(0.0001, 0.25)  10);
puts("/* END fs_pow_test.c output */");
return 0;
}
/* END fs_pow_test.c */
/* BEGIN fs_pow.h */
/*
** Portable code for either freestanding or hosted
** implementations of C.
*/
#ifndef H_FS_POW_H
#define H_FS_POW_H
double fs_pow(double x, double y);
double fs_fmod(double x, double y);
double fs_exp(double x);
double fs_log(double x);
double fs_sqrt(double x);
#endif
/* END fs_pow.h */
/* BEGIN fs_pow.c */
#include <float.h>
#include "fs_pow.h"
double fs_pow(double x, double y)
{
double p;
if (0 x && fs_fmod(y, 1) == 0) {
if (fs_fmod(y, 2) == 0) {
p = fs_exp(fs_log(x) * y);
} else {
p = fs_exp(fs_log(x) * y);
}
} else {
if (x != 0  0 >= y) {
p = fs_exp(fs_log( x) * y);
} else {
p = 0;
}
}
return p;
}
double fs_fmod(double x, double y)
{
double a, b;
const double c = x;
if (0 c) {
x = x;
}
if (0 y) {
y = y;
}
if (y != 0 && DBL_MAX >= y && DBL_MAX >= x) {
while (x >= y) {
a = x / 2;
b = y;
while (a >= b) {
b *= 2;
}
x = b;
}
} else {
x = 0;
}
return 0 c ? x : x;
}
double fs_exp(double x)
{
unsigned n, square;
double b, e;
static double x_max, x_min;
static int initialized;
if (!initialized) {
initialized = 1;
x_max = fs_log(DBL_MAX);
x_min = fs_log(DBL_MIN);
}
if (x_max >= x && x >= x_min) {
for (square = 0; x 1; x /= 2) {
++square;
}
while (1 x) {
++square;
x /= 2;
}
e = b = n = 1;
do {
b /= n++;
b *= x;
e += b;
b /= n++;
b *= x;
e += b;
} while (b DBL_EPSILON / 4);
while (square != 0) {
e *= e;
}
} else {
e = x 0 ? DBL_MAX : 0;
}
return e;
}
double fs_log(double x)
{
int n;
double a, b, c, epsilon;
static double A, B, C;
static int initialized;
if (x 0 && LDBL_MAX >= x) {
if (!initialized) {
initialized = 1;
A = fs_sqrt(2);
B = A / 2;
C = fs_log(A);
}
for (n = 0; x A; x /= 2) {
++n;
}
while (B x) {
n;
x *= 2;
}
a = (x  1) / (x + 1);
x = C * n + a;
c = a * a;
n = 1;
epsilon = DBL_EPSILON * x;
if (0 a) {
if (epsilon 0) {
epsilon = epsilon;
}
do {
n += 2;
a *= c;
b = a / n;
x += b;
} while (epsilon b);
} else {
if (0 epsilon) {
epsilon = epsilon;
}
do {
n += 2;
a *= c;
b = a / n;
x += b;
} while (b epsilon);
}
x *= 2;
} else {
x = DBL_MAX;
}
return x;
}
double fs_sqrt(double x)
{
int n;
double a, b;
if (x 0 && DBL_MAX >= x) {
for (n = 0; x 2; x /= 4) {
++n;
}
while (0.5 x) {
n;
x *= 4;
}
a = x;
b = (1 + x) / 2;
do {
x = b;
b = (a / b + b) / 2;
} while (x b);
while (n 0) {
x *= 2;
n;
}
while (0 n) {
x /= 2;
++n;
}
} else {
if (x != 0) {
x = DBL_MAX;
}
}
return x;
}
/* END fs_pow.c */

pete
pete wrote:
>
/* BEGIN fs_pow.h */
/*
** Portable code for either freestanding or hosted
** implementations of C.
*/
#ifndef H_FS_POW_H
#define H_FS_POW_H
double fs_pow(double x, double y);
double fs_fmod(double x, double y);
double fs_exp(double x);
double fs_log(double x);
double fs_sqrt(double x);
Interesting. What are the license requirements on the code?

Thad
"Roman Mashak" <mr*@tusur.ruwrote:
I'd like to make a simple replacement of 'pow()' function for the embedded
platform I'm working on. What is the better way, probably bit shifting?
Bit shifting may suffice for a function intended to produce positive
integral powers of integers, but for a complete implementation of pow()
it won't do: you try shifting a float by a double and see what the
result is...
Richard
Thad Smith wrote:
>
pete wrote:
/* BEGIN fs_pow.h */
/*
** Portable code for either freestanding or hosted
** implementations of C.
*/
#ifndef H_FS_POW_H
#define H_FS_POW_H
double fs_pow(double x, double y);
double fs_fmod(double x, double y);
double fs_exp(double x);
double fs_log(double x);
double fs_sqrt(double x);
Interesting. What are the license requirements on the code?
It's just trivial code.

pete
Thad Smith wrote:
>
pete wrote:
/* BEGIN fs_pow.h */
/*
** Portable code for either freestanding or hosted
** implementations of C.
*/
#ifndef H_FS_POW_H
#define H_FS_POW_H
double fs_pow(double x, double y);
double fs_fmod(double x, double y);
double fs_exp(double x);
double fs_log(double x);
double fs_sqrt(double x);
Interesting. What are the license requirements on the code?
I don't know. I think it's public domain.
Here's some more: http://www.mindspring.com/~pfilandr/C/fs_math/
I got bored with it after writing fs_cos.

pete
pete wrote:
Thad Smith wrote:
>Interesting. What are the license requirements on the code?
It's just trivial code.
Licensing isn't about whether the code is trivial or not.

Chris "bits typed with metabits [typed with metametabits ...]" Dollin
HewlettPackard Limited registered no:
registered office: Cain Road, Bracknell, Berks RG12 1HN 690597 England
On Thu, 13 Dec 2007 16:43:45 0800, Roman Mashak wrote:
Hello,
I'd like to make a simple replacement of 'pow()' function for the embedded
platform I'm working on. What is the better way, probably bit shifting?
Thanks.
Best regards, Roman Mashak.
You can implement exp and log via the cordic algorithm. See eg http://en.wikipedia.org/wiki/CORDIC
and links therein
pete wrote:
Thad Smith wrote:
>pete wrote:
>>/* BEGIN fs_pow.h */ /* ** Portable code for either freestanding or hosted ** implementations of C. */ #ifndef H_FS_POW_H #define H_FS_POW_H
double fs_pow(double x, double y); double fs_fmod(double x, double y); double fs_exp(double x); double fs_log(double x); double fs_sqrt(double x);
Interesting. What are the license requirements on the code?
I don't know. I think it's public domain.
If it is public domain, it is rather old, or explicitly declared such by
the author. The default in the US and most other countries is copyright
at the time of creation.
If you wrote the code and would like others to use it, I recommend that
you place a comment in the header stating that it is donated to the
public domain by the author, and include your name.

Thad
Thad Smith wrote:
>
pete wrote:
Thad Smith wrote:
pete wrote: /* BEGIN fs_pow.h */ /* ** Portable code for either freestanding or hosted ** implementations of C. */ #ifndef H_FS_POW_H #define H_FS_POW_H
double fs_pow(double x, double y); double fs_fmod(double x, double y); double fs_exp(double x); double fs_log(double x); double fs_sqrt(double x);
Interesting. What are the license requirements on the code?
I don't know. I think it's public domain.
If it is public domain, it is rather old,
or explicitly declared such by the author.
The default in the US and most other countries is copyright
at the time of creation.
If you wrote the code and would like others to use it,
I recommend that
you place a comment in the header stating that it is donated to the
public domain by the author, and include your name.
OK

pete
Op Thu, 13 Dec 2007 14:37:43 +0100 schreef Chris Dollin
<ch**********@hp.com>:
pete wrote:
>Thad Smith wrote:
>>Interesting. What are the license requirements on the code?
It's just trivial code.
Licensing isn't about whether the code is trivial or not.
Yes it is. Any license on something trivial cannot be enforced. Except
in an unreasonable justice system, of course...

Gemaakt met Opera's revolutionaire emailprogramma: http://www.opera.com/mail/
pete wrote:
Thad Smith wrote:
>pete wrote:
>>Thad Smith wrote: pete wrote: /* BEGIN fs_pow.h */ /* ** Portable code for either freestanding or hosted ** implementations of C. */ #ifndef H_FS_POW_H #define H_FS_POW_H > double fs_pow(double x, double y); double fs_fmod(double x, double y); double fs_exp(double x); double fs_log(double x); double fs_sqrt(double x); Interesting. What are the license requirements on the code? I don't know. I think it's public domain.
If it is public domain, it is rather old, or explicitly declared such by the author. The default in the US and most other countries is copyright at the time of creation.
If you wrote the code and would like others to use it, I recommend that you place a comment in the header stating that it is donated to the public domain by the author, and include your name.
OK
Thanks. It matters to people who program for a living and are careful
about getting legal rights to the code they use.
As a suggestion, consider contributing it to Snippets.org, which has a
public domain collection of code snippets.

Thad
Thad Smith wrote:
>
pete wrote:
Thad Smith wrote:
pete wrote: Thad Smith wrote: pete wrote: /* BEGIN fs_pow.h */ /* ** Portable code for either freestanding or hosted ** implementations of C. */ #ifndef H_FS_POW_H #define H_FS_POW_H
double fs_pow(double x, double y); double fs_fmod(double x, double y); double fs_exp(double x); double fs_log(double x); double fs_sqrt(double x); Interesting. What are the license requirements on the code? I don't know. I think it's public domain.
If it is public domain, it is rather old,
or explicitly declared such by the author.
The default in the US and most other countries is copyright
at the time of creation.
If you wrote the code and would like others to use it,
I recommend that
you place a comment in the header stating that it is donated to the
public domain by the author, and include your name.
OK
Thanks. It matters to people who program for a living and are careful
about getting legal rights to the code they use.
As a suggestion, consider contributing it to Snippets.org, which has a
public domain collection of code snippets.
OK

pete
"Boudewijn Dijkstra" <bo*******@indes.comwrote:
Op Thu, 13 Dec 2007 14:37:43 +0100 schreef Chris Dollin
pete wrote:
Thad Smith wrote:
>Interesting. What are the license requirements on the code?
It's just trivial code.
Licensing isn't about whether the code is trivial or not.
Yes it is. Any license on something trivial cannot be enforced. Except
in an unreasonable justice system, of course...
pete is in the USA.
Richard This thread has been closed and replies have been disabled. Please start a new discussion. Similar topics
by: Arik Peltz 
last post by:
Hi,
Does anybody know how pow() function is implemented in the standard
libraries of visual c++ 6.0 ?
Thanks,
Arik

by: Robert Smith 
last post by:
Sorry if I posted this incorrectly and/or in the wrong place. I'm an idiot.
Nevertheless, it would be kind if someone forwarded this to the appropriate
people
VC 6 VC 7...

by: Black Eagle 
last post by:
Hey guys,
Under linux, I tried this :
#include <stdio.h>
#include <math.h>
main()
{
double a= 2.0;
double b= 3.0;
printf("%f^%f=%f",a,b,pow(a,b));

by: Magix 
last post by:
#include <math.h>
double pow( double base, double exp );
will pow (2, 30) works fine ? (exp is negative value). If not, what are the
workaround for exp to be negative?

by: matrim 
last post by:
What I'm trying to do:
1. Attempt to open the file. The filename, c:\\windData.txt, should be hardcoded into your program. Note the two slash characters in the file name. If the file cannot be...

by: satya3005 
last post by:
Dear members can u please tell me how to write code for x power n with out using pow() function.The manipulation code must be in only one line.

by: denxx 
last post by:
Hi, I am new in C++ and was trying to run a programme where I found an error using the pow statement. Error showed is error C2660: 'pow' : function does not take 1 parameters. As I have a square on...

by: Richard Ballin 
last post by:
Hello All,
I am taking a class using Visual Studio C++ Express 2010 and on one of the first projects i need to use the Math::Pow() function. The book does not do a good job of explaining how to...

by: VivesProcSPL 
last post by:
Obviously, one of the original purposes of SQL is to make data query processing easy. The language uses many Englishlike terms and syntax in an effort to make it easy to learn, particularly for...

by: abbasky 
last post by:
### Vandf component communication method one: data sharing
Vandf components can achieve data exchange through data sharing, state sharing, events, and other methods. Vandf's data exchange method...

by: isladogs 
last post by:
The next Access Europe meeting will be on Wednesday 7 Feb 2024 starting at 18:00 UK time (6PM UTC) and finishing at about 19:30 (7.30PM).
In this month's session, the creator of the excellent VBE...

by: stefan129 
last post by:
Hey forum members, I'm exploring options for SSL certificates for multiple domains. Has anyone had experience with multidomain SSL certificates? Any recommendations on reliable providers or specific...

by: davi5007 
last post by:
Hi,
Basically, I am trying to automate a field named TraceabilityNo into a web page from an access form. I've got the serial held in the variable strSearchString. How can I get this into the...

by: MeoLessi9 
last post by:
I have VirtualBox installed on Windows 11 and now I would like to install Kali on a virtual machine. However, on the official website, I see two options: "Installer images" and "Virtual machines"....

by: DolphinDB 
last post by:
The formulas of 101 quantitative trading alphas used by WorldQuant were presented in the paper 101 Formulaic Alphas. However, some formulas are complex, leading to challenges in calculation.
Take...

by: DolphinDB 
last post by:
Tired of spending countless mintues downsampling your data? Look no further!
In this article, you’ll learn how to efficiently downsample 6.48 billion highfrequency records to 61 million...

by: Aftab Ahmad 
last post by:
So, I have written a code for a cmd called "Send WhatsApp Message" to open and send WhatsApp messaage. The code is given below.
Dim IE As Object
Set IE =...
 