KEIL中如何将Uint16转换为浮点数

KEIL中如何将Uint16转换为浮点数
千次阅读
2020-07-17 16:29:20
C/C++中 float与uint16类型转换方法
为什么要做float与uint16互相转换
方法一:
方法二:
为什么要做float与uint16互相转换
此需求在串口通信时常常会被用到,串口只能以字符型(char)进行通信,如果要首发浮点型(float),使用浮点转字符串的方法就比较麻烦。

方法一:
利用库函数:

C/C++语言提供了几个标准库函数,可以将字符串转换为任意类型(整型、长整型、浮点型等)。

atof():将字符串转换为双精度浮点型值。
atoi():将字符串转换为整型值。
但他们不适用于跨平台的应用场景。

那么可以使用另外一个函数
sprintf函数的格式:int sprintf( char *buffer, const char *format [, argument,…] );
除了前两个参数固定外,可选参数可以是任意个。buffer是字符数组名;format是格式化字符串。

方法二:
利用内存存储格式转换,该方法处理数据大大的简单化,而且可以把4个字节的字符型转成两个字节,大大提高了传输效率,当然,如果你想传双精度浮点型 double或者是精度要达到小数点后四位的话,那么就使用内存地址复制的方式,库函数为

void *memcpy(void *destin, void *source, unsigned n)
定义一个共用体

union Fp32
{
uint32_t u;
float f;
};
浮点转uint16函数

uint16_t float_cov_uint16(float value)
{

const Fp32 f32infty = { 255U << 23 };
const Fp32 f16infty = { 31U << 23 };
const Fp32 magic = { 15U << 23 };
const uint32_t sign_mask = 0x80000000U;
const uint32_t round_mask = ~0xFFFU;

Fp32 in;
uint16_t out;

in.f = value;

uint32_t sign = in.u & sign_mask;
in.u ^= sign;

if (in.u >= f32infty.u) /* Inf or NaN (all exponent bits set) */
{
    /* NaN->sNaN and Inf->Inf */
    out = (in.u > f32infty.u) ? 0x7FFFU : 0x7C00U;
}
else /* (De)normalized number or zero */
{
    in.u &= round_mask;
    in.f *= magic.f;
    in.u -= round_mask;
    if (in.u > f16infty.u)
    {
        in.u = f16infty.u; /* Clamp to signed infinity if overflowed */
    }

    out = uint16_t(in.u >> 13); /* Take the bits! */
}

out = uint16_t(out | (sign >> 16));

return out;

}
uint16转float函数

float uint6_cov_float(uint16_t value)
{
const Fp32 magic = { (254U - 15U) << 23 };
const Fp32 was_infnan = { (127U + 16U) << 23 };
Fp32 out;

out.u = (value & 0x7FFFU) << 13;   /* exponent/mantissa bits */
out.f *= magic.f;                  /* exponent adjust */
if (out.f >= was_infnan.f)         /* make sure Inf/NaN survive */
{
    out.u |= 255U << 23;
}
out.u |= (value & 0x8000U) << 16;  /* sign bit */

return out.f;

}

  • 0
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值