打印
[STM32F1]

实现从float到int的强转

[复制链接]
498|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
xiaoyaodz|  楼主 | 2024-6-29 12:32 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
TI, AMP, ig, index, TF, 11



#include<stdio.h>
#include<stdlib.h>
int float_to_int(float f)
{

    int i;
    int f_new=*(int *)&f;//float不能直接做位运算
    /*符号位*/
    int sign=0;
    if(f_new>>31)  //sign初值设置为0 右移31位取出符号位
    {
        sign=1;
    }

    /*指数位*/
    int index=f_new&0x7f800000;  //011111111...(23个0)
    index=f_new>>23;
    index=index-127;   //130-127=3

    /*尾数位*/
    int temp=f_new&0x007fffff; //先和...(9个0)1111..(23个1)& 取出尾数部分放在临时变量中
    int mantissa=temp|0x00800000;  //因为最后尾数前要加1 所以现在就和00 (1000)0 00 00 |,相当于提前处理加1
    i=mantissa>>(24-(index+1));  //因为尾数提前加1 所以要右移24-(指数+1)位

    if(sign==1)  //如果符号位为1 为负数
    {
        i=-i;
    }
    return i;
}
void main()
{
    float f=13.55;
    printf("%d",float_to_int(f));
}


使用特权

评论回复
沙发
公羊子丹| | 2024-6-29 13:19 | 只看该作者
学习一下

使用特权

评论回复
板凳
suncat0504| | 2024-6-29 20:09 | 只看该作者
涉及小数的处理,通常很消耗内存啊。而且感觉准确度不如整数型的。

使用特权

评论回复
地板
szt1993| | 2024-6-30 08:45 | 只看该作者
涉及小数还需要转换

使用特权

评论回复
5
hehhehee| | 2024-6-30 11:14 | 只看该作者
符号位的判断和处理有一些不必要的复杂性。

使用特权

评论回复
6
hehhehee| | 2024-6-30 11:14 | 只看该作者
实际上,可以直接通过位运算获取符号位,无需单独判断和设置 sign 变量。

使用特权

评论回复
7
hehhehee| | 2024-6-30 11:14 | 只看该作者
指数部分应该是从浮点数的位表示中获取,而不是直接减去偏置值(127)。

使用特权

评论回复
8
hehhehee| | 2024-6-30 11:14 | 只看该作者
正确的方式是将指数部分从浮点数位表示中提取出来,然后减去偏置值(127)来得到实际的指数值。

使用特权

评论回复
9
hehhehee| | 2024-6-30 11:14 | 只看该作者
尾数位的提取和处理看起来正确,但是后续的位移操作可能需要重新考虑。

使用特权

评论回复
10
hehhehee| | 2024-6-30 11:14 | 只看该作者
IEEE 754浮点数表示中,符号位是最高位(单精度浮点数的第31位)。您正确地识别了符号位,但在计算上有一些错误。应该使用(f_new < 0)来检查f_new是否为负数,而不是(f_new >> 31)。

使用特权

评论回复
11
芯路例程| | 2024-6-30 11:57 | 只看该作者
这个强转和自带的强转有啥意思。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

36

主题

4770

帖子

2

粉丝