我已设置并集读取32位浮点值,即32.0800018310(二进制= 100000.0001010001111011)。
现在,我想使用12字节(每字节8位)的整数数组显示浮点数的内容。
但是我得到以下输出:
Display:
236
81
0
66
不应该
data_to_send[0]
返回浮点数的前8位,即01111011(十进制= 123)data_to_send[1]
返回浮点数的后8位,即00010100(十进制= 20)data_to_send[2]
返回浮点数的后8位,即100000。(十进制= 32)data_to_send[3]
返回浮点数的后8位,即0。(十进制= 0)数字.
会怎样?您如何显示?
union
{
uint8_t data_to_send[12];
float float_value;
} union_var;
union_var.float_value = 32.0800018310
//display array
USB.print("Display: ");
USB.printf("%d \n", union_var.data_to_send[0]);
USB.printf("%d \n", union_var.data_to_send[1]);
USB.printf("%d \n", union_var.data_to_send[2]);
USB.printf("%d \n", union_var.data_to_send[3]);
答案 0 :(得分:3)
float
值的存储方式取决于计算机的体系结构。
如今,它们几乎总是以IEEE 754格式存储,这与您的想象完全不同。
答案 1 :(得分:1)
标准C中的浮点表示形式被分解为3组:正负号,尾数和指数。 Here可以看到如何打印,一点一点地阅读它以及有关C标准实现的浮点的其他信息。
答案 2 :(得分:0)
如何存储它取决于您的系统细节。但通常最高有效位是符号,然后8位指数偏移127,然后是21个尾数表示要求和的分数。
#include <stdio.h>
#include <stdint.h>
void main(void){
int i;
union
{
uint8_t data_to_send[12];
float float_value;
} union_var;
union_var.float_value = 32.0800018310;
unsigned char sign = 43 + ((union_var.data_to_send[3] >> 7) << 1);
int exponent = ((union_var.data_to_send[3] & 0x7F) << 1) + (union_var.data_to_send[2] >> 7) - 127;
int mantissa_store = (union_var.data_to_send[2] & 0x7F << 16) + (union_var.data_to_send[1] << 8) + union_var.data_to_send[0];
double mantissa = 1.0;
double part = 0.5;
for (i=22;i>=0;i--)
{
if (mantissa_store & (1<<i))
{
mantissa += part;
}
part /= 2;
}
printf("Float is: %c 2^%d * %.12f\n",sign,exponent, mantissa);
printf("Mantissa value: %d\n",mantissa_store);
}
输出:
Float is: + 2^5 * 1.002500057220
Mantissa value: 20972
答案 3 :(得分:0)
浮点值为32.0800018310(二进制= 100000.0001010001111011)。
您将“定点数”表示法与“浮点数”表示法混淆。
数字32.0800018310确实具有二进制表示形式00000000.0100000.00010100.01111011 如果存储为缩放因子为2 ^ 16的定点数字
也就是说:
2^16 is 65536
00000000.0100000.00010100.01111011 as normal binary number is 2102395
and
2102395 / 65536 is 32.0800018310
因此,作为比例因子为2 ^ 16的定点数,您的二进制表示形式是正确的,但是...
计算机不会将浮点存储为定点数。常见的方法是使用IEEE 754格式。
因此,当您以二进制格式打印浮动时,您将看到IEEE 754的二进制表示形式,而不是您期望的值。
定点格式不是C标准的一部分,但是如果您想使用定点数学运算,可以从网上下载许多C定点库。