float内存实现

以8.25举例

1.换算成二进制

  8 = 1000;

  0.25= .01     0.25*2 = 0.5 个位取0,0.5*2 = 1个位取1 ;

 8.25 = 1000.01 

2.换算成科学计数法

8.25 = 1000.01= 1.00001 * 2^3

3.float 内存占用4个字节,32位 = 1符号位+8指数位+23底数位

   3.1 符号位0正1负;

   3.2 规定指数位-127=真正的指数,所以,指数位-127=3;指数位=130=10 000 010 ;(因为指数位站8位,如果不减去127,范围是0到255,因为有正负之分,所以减去127,范围变为-127~128)

   3.3 底数位 00001 000 000 000 000 000 000 

完整: 0   10 000 010   00001 000 000 000 000 000 000

 

  

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
将一个 double 类型的数转换为 float 类型的数,需要注意以下几个细节: 1. 首先需要判断 double 类型的数能否转换为 float 类型的数。如果 double 类型的数超过了 float 类型的表示范围,那么转换结果将会失真。 2. double 类型的数和 float 类型的数在内存中的存储方式是不同的,因此需要进行位级别的转换。 具体的实现细节如下: ```c++ // double转float的位级别实现 float double2float(double d) { // 检查是否可以转换 if (d < -FLT_MAX || d > FLT_MAX) { return 0; // 超出float类型范围,返回0 } // 将double类型的数先转换为unsigned long long类型 unsigned long long ull = *(unsigned long long*)&d; // 提取符号位、指数位和尾数位 int sign = (ull >> 63) & 0x1; int exp = ((ull >> 52) & 0x7ff) - 1023; unsigned int frac = ull & 0xfffffffffffff; // 根据IEEE 754规范,float类型的指数位比double类型少了10个bit,需要进行调整 if (exp > 127) { exp = 127; frac = 0; } else if (exp < -126) { exp = -126; frac = (frac >> 24) | ((frac >> 23) & 0x1); } else { frac = (frac >> 23) | ((frac >> 22) & 0x1); } // 将符号位、指数位和尾数位组合成一个32位的float类型数 unsigned int f = (sign << 31) | ((exp + 127) << 23) | (frac & 0x7fffff); // 将unsigned int类型的数转换为float类型的数 return *(float*)&f; } ``` 在上述代码中,首先判断了 double 类型的数是否可以转换为 float 类型的数,如果超出了 float 类型的范围,返回 0。 然后将 double 类型的数先转换为 unsigned long long 类型的数,再将其分解为符号位、指数位和尾数位,根据 IEEE 754 规范对指数位进行调整,最后将符号位、指数位和尾数位组合成一个 32 位的 float 类型数,并将其转换为 float 类型的数返回。 需要注意的是,在将 double 类型的数转换为 unsigned long long 类型的数时,需要使用指针进行类型转换。这样做虽然可以实现位级别的转换,但是可能会涉及到类型安全问题,需要谨慎使用。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值