122 lines
2.0 KiB
C
122 lines
2.0 KiB
C
#include "math.h"
|
|
|
|
float iot_abs(float x)
|
|
{
|
|
if(x<0) x=0-x;
|
|
return x;
|
|
}
|
|
|
|
float iot_sin(float x)
|
|
{
|
|
const float B = 1.2732395447;
|
|
const float C = -0.4052847346;
|
|
const float P = 0.2310792853;//0.225;
|
|
float y = B * x + C * x * iot_abs(x);
|
|
y = P * (y * iot_abs(y) - y) + y;
|
|
return y;
|
|
}
|
|
|
|
float iot_cos(float x)
|
|
{
|
|
const float Q = 1.5707963268;
|
|
const float PI =3.1415926536;
|
|
x += Q;
|
|
|
|
if(x > PI)
|
|
x -= 2 * PI;
|
|
|
|
return( iot_sin(x));
|
|
}
|
|
|
|
float iot_sqrt(float a)
|
|
{
|
|
double x,y;
|
|
x=0.0;
|
|
y=a/2;
|
|
while(x!=y)
|
|
{
|
|
x=y;
|
|
y=(x+a/x)/2;
|
|
}
|
|
return x;
|
|
}
|
|
|
|
float iot_pow(float a,int b)
|
|
{
|
|
float r=a;
|
|
if(b>0)
|
|
{
|
|
while(--b)
|
|
r*=a;
|
|
|
|
}
|
|
else if(b<0)
|
|
{
|
|
while(++b)
|
|
r*=a;
|
|
r=1.0/r;
|
|
}
|
|
else r=0;
|
|
return r;
|
|
}
|
|
|
|
|
|
static double Sqrt(double x)
|
|
{
|
|
if (x < 0)
|
|
return -1;
|
|
if (x == 0)
|
|
return 0;
|
|
double y = (double)iot_sqrt((double)x);
|
|
|
|
return (y + x / y) / 2;
|
|
}
|
|
|
|
static double NegativeLog(double q)
|
|
{
|
|
int p;
|
|
double pi2 = 6.283185307179586476925286766559;
|
|
double eps2 = 0.00000000000001; // 1e-14
|
|
double eps1; // 1e-28
|
|
double r = q, s = q, n = q, q2 = q * q, q1 = q2 * q;
|
|
|
|
eps1 = eps2 * eps2;
|
|
|
|
for (p = 1; (n *= q1) > eps1; s += n, q1 *= q2)
|
|
r += (p = !p) ? n : -n;
|
|
|
|
double u = 1 - 2 * r, v = 1 + 2 * s, t = u / v;
|
|
double a = 1, b = Sqrt(1 - t * t * t * t);
|
|
|
|
for (; a - b > eps2; b = Sqrt(a * b), a = t)
|
|
t = (a + b) / 2;
|
|
|
|
return pi2 / (a + b) / v / v;
|
|
}
|
|
|
|
static double Log(double x)
|
|
{
|
|
int k = 0;
|
|
double ln10 = 2.30258509299404568401799145468;
|
|
|
|
if (x <= 0)
|
|
return -1;
|
|
if (x == 1)
|
|
return 0;
|
|
|
|
for (; x > 0.1; k++)
|
|
x /= 10;
|
|
for (; x <= 0.01; k--)
|
|
x *= 10;
|
|
|
|
return k * ln10 - NegativeLog(x);
|
|
}
|
|
|
|
double Log10(double x)
|
|
{
|
|
double ln10 = 2.30258509299404568401799145468;
|
|
|
|
return Log(x) / ln10;
|
|
}
|
|
|