[STM32F1] 实现从float到int的强转

[复制链接]
1578|11
 楼主| xiaoyaodz 发表于 2024-6-29 12:32 | 显示全部楼层 |阅读模式
TI, AMP, ig, index, TF, 11



  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. int float_to_int(float f)
  4. {

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

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

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

  21.     if(sign==1)  //如果符号位为1 为负数
  22.     {
  23.         i=-i;
  24.     }
  25.     return i;
  26. }
  27. void main()
  28. {
  29.     float f=13.55;
  30.     printf("%d",float_to_int(f));
  31. }


公羊子丹 发表于 2024-6-29 13:19 | 显示全部楼层
学习一下
suncat0504 发表于 2024-6-29 20:09 | 显示全部楼层
涉及小数的处理,通常很消耗内存啊。而且感觉准确度不如整数型的。
szt1993 发表于 2024-6-30 08:45 来自手机 | 显示全部楼层
涉及小数还需要转换
hehhehee 发表于 2024-6-30 11:14 | 显示全部楼层
符号位的判断和处理有一些不必要的复杂性。
hehhehee 发表于 2024-6-30 11:14 | 显示全部楼层
实际上,可以直接通过位运算获取符号位,无需单独判断和设置 sign 变量。
hehhehee 发表于 2024-6-30 11:14 | 显示全部楼层
指数部分应该是从浮点数的位表示中获取,而不是直接减去偏置值(127)。
hehhehee 发表于 2024-6-30 11:14 | 显示全部楼层
正确的方式是将指数部分从浮点数位表示中提取出来,然后减去偏置值(127)来得到实际的指数值。
hehhehee 发表于 2024-6-30 11:14 | 显示全部楼层
尾数位的提取和处理看起来正确,但是后续的位移操作可能需要重新考虑。
hehhehee 发表于 2024-6-30 11:14 | 显示全部楼层
IEEE 754浮点数表示中,符号位是最高位(单精度浮点数的第31位)。您正确地识别了符号位,但在计算上有一些错误。应该使用(f_new < 0)来检查f_new是否为负数,而不是(f_new >> 31)。
芯路例程 发表于 2024-6-30 11:57 | 显示全部楼层
这个强转和自带的强转有啥意思。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

36

主题

5017

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部