#include "my_math.h"

uint16_t sqrt_u16(uint32_t value)
{
    uint32_t rem = 0;
    uint32_t sqrt_value = 0;
    uint32_t divisor = 0;

    for(int i = 0; i < 16; i++)
    {
	sqrt_value <<= 1;
	rem = ((rem << 2) + (value >> 30));
	value <<= 2;
	divisor = (sqrt_value << 1) + 1;
	if(divisor <= rem)
	{
	    rem -= divisor;
	    sqrt_value++;
	}
    }
    return (uint16_t)sqrt_value;
}

uint32_t sqrt_u32(uint64_t value)
{
    uint32_t sqrt_value;
    uint64_t temp,ttp;			//结果、循环计数

    if(value == 0)			//被开方数，开方结果也为0
    {
	return 0;
    }
    sqrt_value = 0;
    temp = (value >> 30);		//获取最高位
    temp <<= 2;
    if(temp > 1)			//最高位为1
    {
	sqrt_value++;			//结果当前位为1，否则为默认的0
	temp -= sqrt_value;
    }

    for(int i = 15; i > 0; i--)		//求剩余的15位
    {
	sqrt_value <<= 1;		//左移一位
	temp <<= 2;
	temp += (value >> 30);		//假设
	
	ttp = sqrt_value;
	ttp = (ttp << 1) + 1;
	
	value <<= 2;
	if(temp >= ttp)			//假设成立
	{
	    temp -= ttp;
	    sqrt_value++;
	}
    }
    return sqrt_value;
}

int16_t No_MaxMin_Average_short(int16_t *dest,uint32_t size)
{
    int16_t min,max;
    int32_t value = 0;
    uint32_t i = 0;

    min = dest[0];
    max = dest[0];

    for(i = 1; i < size; i++)
    {
	if(dest[i] < min)
	{
	    min = dest[i];
	}
	if(dest[i] > max)
	{
	    max = dest[i];
	}
    }

    for(i = 0; i < size; i++)
    {
	value += dest[i];
    }
    value = value - min - max;
    value /= (size - 2);

    return (int16_t)value;
}

int16_t Average_short(int16_t *dest,uint32_t size)
{
    int32_t value = 0;
    uint32_t i = 0;
	
    if(size == 1)
    {
	return *dest;
    }
	
    for(i = 0; i < size; i++)
    {
	value += dest[i];
    }

    value /= size;

    return (int16_t)value;
}

float Average_float(float *dest,uint32_t size)
{
    float value = 0;

    if(size == 1)
    {
	return *dest;
    }

    value = dest[0];
    for(int i = 1; i < size; i++)
    {
	value += dest[i];
	value /= 2.0;
    }

    return value;
}

bool get_MaxMinValue(int16_t *max,int16_t *min,int16_t *value,uint32_t size)
{
    if(size < 2)
    {
	return false;
    }
    *max = *value;
    *min = *value++;
    size--;
    while(size--)
    {
	if(*value < *min)
	{
	    *min = *value;
	}
	else if(*value > *max)
	{
	    *max = *value;
	}
	value++;
    }
    return true;
}

int get_MaxFloatArray(float *max,float *array,int count)
{
    int idx = 0;

    for(int i = 0; i < count; i++)
    {
	if(*max < array[i])
	{
	    *max = array[i];
	    idx = i;
	}
    }

    return idx;
}

float get_float_Variance_Sum(float *value,int len)
{
    float var = 0;
    float sum = 0;
    for(int i = 0; i < len; i++)
    {
	var += value[i];
    }
    var /= len;

    for(int i=0;i<len;i++)
    {
	sum+=(value[i]-var)*(value[i]-var);
    }

    return sum;
}

float get_float_abs(float value)
{
    if(value < 0)
    {
	value = 0 - value;
    }
    return value;
}

double simpson(double (*f)(double),double l,double r){
    return (r - l) * (f(l) + 4 * f((l + r) / 2) + f(r)) / 6;
}

///*  函数功能：计算函数1+x*x的函数值 */
//float Fun1(float x)
//{
//    return  1 + x * x;
//}
// 
///*  函数功能：计算函数x/(1+x*x)的函数值 */
//float Fun2(float x)
//{
//    return x / (1 + x * x);
//}
 
/*    函数功能：用梯形法计算函数的定积分 */
float Integral(float (*f)(float), float a, float b,int n)
{
    float s, h;
//	int n = 100, i;
    s = ((*f)(a) + (*f)(b)) / 2;
    h = (b - a) / n;

    for (int i=1; i<n; i++)
    {
	s += (*f)(a + i * h);
    }
    return s * h ;
}

int get_int_Variance_Sum(int *value,int len)
{
    int var=0;
    int sum=0;
    for(int i=0;i<len;i++)
    {
	var += value[i];
    }
    var /= len;

    for(int i=0;i<len;i++)
    {
	sum += (value[i]-var) * (value[i]-var);
    }

    return sum;
}

int get_ushort_Variance_Sum(uint16_t *value,int len)
{
    int var=0;
    int sum=0;
    for(int i=0;i<len;i++)
    {
	var += value[i];
    }
    var /= len;

    for(int i=0;i<len;i++)
    {
	sum += (value[i]-var) * (value[i]-var);
    }

    return sum;
}

//将任意字符转换为十进制 [0-9a-zA-Z],61个字符，最大表示62进制
int Base62_convertToDec(char c)
{
   int decNum = 0;
   if(c>='0' && c<='9')
   {
       decNum = c - 48;
   }
   else if(c>='a' && c<='z')
   {
       decNum = c - 87;
   }
   else if(c>='A' && c<='Z')
   {
       decNum = c - 29;
   }
   return decNum;
}

//将十进制转换为这些字符 [0-9a-zA-Z],61个字符，最大表示62进制
char Base62_convertFromDec(int c)
{
    char objchar;
    if(c>=0 && c<=9)
	objchar=c+48;
    else if(c>=10 && c<=35)
	objchar=c+87;
    else if(c>=36 && c<=61)
	objchar=c+29;
    return objchar;
}
