c语言常用math函数及进制转换

c语言常用math函数及进制转换

引言

此文章初衷作为笔记,记录常用的math函数及进制转换,以备函数忘了或需要时可以找到相应的函数使用。有错误请及时提出,大家也可以提供更多常用的算法函数。

一、math函数

1.添加死区
2.失真限制
3.取绝对值
4.求两个数的最大值
5.求两个数的最小值
6.计算给定纬度下,一分经纬度代表的距离(cm)
7.计算目标点经纬度与自身现在经纬度的航向角

1.添加死区

死区(deadband)有时也称为中性区(neutral zone)或不作用区,是指控制系统的传递函数中,对应输出为零的输入信号范围。

* 名    称:float data_to_deadzone(float x,float ref,float zoom)
* 功    能:添加死区
* 入口参数:x:原始数据 ref:mid-value zoom:dead zone
* 出口参数:data with dead zone added
* 说    明:经过该函数处理,数据输出为-(输入数据最大值-deadband)~0~(输入数据最大值-deadband)v
float data_to_deadzone(float x,float ref,float zoom)
{
    float t;
    if(x>ref)
    {
        t = x - zoom;   //x不管在ref~ref+zoom之间怎么变,输出t始终为ref
        if(t<ref)
        {
            t = ref;
        }
    }
    else
    {
        t = x + zoom;
        if(t>ref)
        {
            t = ref;
        }
    }
	return (t);
}
2.失真限制

数据失真限制,大小数据都掐掉

float limit(float data, float min, float max)
{
    data = data > max ? max : data;
    data = data < min ? min : data;
    return data;
}
3.取绝对值
float absolute(float x)
{
    x = x >0 ? x : -x;
    return x;
}
4.求两个数的最大值
float max(float a, float b)
{
    a = a > b ? a : b;
    return a;
}
5.求两个数的最小值
float min(float a, float b)
{
    a = a > b ? b : a;
    return a;
}
6.计算给定纬度下,一分经纬度代表的距离
#define PI 3.14159265358979323846
#define DEGREE_TO_RADIAN(degree) ((degree) * (PI / 180.0))
#define EARTH_RADIUS_IN_KM 6371.0
#define METERS_PER_DEGREE 111320.0


// 计算给定纬度下,一分经纬度代表的距离(以厘米为单位)
void calculateDistancePerMinute(double latitude, double *distancePerMinLat, double *distancePerMinLon) {
    // 纬度的长度(以厘米为单位)
    *distancePerMinLat = (METERS_PER_DEGREE / 60) * 100;

    // 经度的长度随纬度变化(以厘米为单位)
    *distancePerMinLon = (cos(DEGREE_TO_RADIAN(latitude)) * METERS_PER_DEGREE / 60) * 100;
}
7.计算目标点经纬度与自身现在经纬度的航向角
double Angle_conversion(double target_latitude,double target_longitude,double feedback_latitude,double feedback_longitude)
{
	double lat1_rad, lon1_rad, lat2_rad, lon2_rad, delta_lon, theta;

	 // 将经纬度转换为弧度
	lat1_rad = feedback_latitude * (PI / 180);
	lon1_rad = feedback_longitude * (PI / 180);
	lat2_rad = target_latitude * (PI / 180);
	lon2_rad = target_longitude * (PI / 180);

	// 计算经度差
	delta_lon = lon2_rad - lon1_rad;

	// 计算航向角
	theta = atan2(sin(delta_lon) * cos(lat2_rad), cos(lat1_rad) * sin(lat2_rad) - sin(lat1_rad) * cos(lat2_rad) * cos(delta_lon));

	// 将航向角转换为度数
	double heading_deg = theta * (180 / PI);

	return heading_deg;
}

二、进制转换

1.十进制转二进制
2.ASCII转十六进制
2.十六进制转ASCII

1.十进制转二进制
uint16_t dectobin(uint16_t n)
{
    int sum = 0;
    int y, x = 1; // y表示余数,x为叠加的系数
    while (n != 0)
    {
        y = n % 2;
        sum += x * y;
        x *= 10;
        n /= 2;
    }
    return sum;
}
2.ASCII转十六进制
uint8_t char_to_hex(uint8_t *src)
{
    uint8_t desc;

    if((*src >= '0') && (*src <= '9'))
        desc = *src - 0x30;
    else if((*src >= 'a') && (*src <= 'f'))
        desc = *src - 0x57;
    else if((*src >= 'A') && (*src <= 'F'))
        desc = *src - 0x37;

    return desc;
}
3.十六进制转ASCII
uint8_t hex_to_char(uint8_t src)
{
    uint8_t desc;

    if((src >= 0) && (src <= 9))
        desc = src + 0x30;
    else if((src >= 0xA) && (src <= 0xF))
        desc = src + 0x37;

    return desc;
}
  • 11
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值