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;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 |