从0 10000101 01010011000000000000001转换到十进制(也就是84.75000762939453125)很好:
FP: 0 10000101 01010011000000000000001
Fraction: (1.)01010011000000000000001
Exp 10000101: 133
Bias: 133-127=6
Moving by exp: 1010100.11000000000000001
Convert parts to decimal: 84.75000762939453125为什么我不能将0 00000001 00000000000000000000001转换为十进制(即(1.1754945E-38):
FP: 0 00000001 00000000000000000000001
Fraction: (1.)00000000000000000000001
Exp 00000001: 1
Bias: 1-127=-126
Moving by exp: 0.00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001
Convert parts to decimal: 0.?!?!?!无法使1.1754945E-38将二进制0.00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001转换为十进制。
我哪里错了?
发布于 2018-04-25 13:42:36
你没有错。工具错了。
我找到了一个页面(当我在googled上搜索"ieee 754转换器“时出现的第一个页面),它与您的号码没有问题:https://www.h-schmidt.net/FloatConverter/IEEE754.html。
我编写了一个小的C程序,它可能包含一些不可移植的、未定义的行为和过时的编码实践,但它显示了一些相关的浮点数和ints之间的转换:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
typedef union {
float f;
int i;
} both;
void printbits(int k) {
int i;
for (i = 0; i < 32; i++) {
if (i == 1 || i == 9)
printf(" ");
if (k & (1<<(31-i)))
printf("1");
else
printf("0");
}
printf("\n");
}
int main() {
printf("sizeof(float) = %ld\n", sizeof(float));
printf("sizeof(int) = %ld\n", sizeof(int));
both u;
u.i = 0x00800001;
printbits(u.i);
printf("%g\n", u.f);
printf("%d %d\n", fpclassify(u.f), isnormal(u.f));
printf("\n");
u.i = 0x00800000;
printbits(u.i);
printf("%g\n", u.f);
printf("%d %d\n", fpclassify(u.f), isnormal(u.f));
printf("\n");
u.i = 0x007fffe1;
printf("%g\n", u.f);
printf("%d %d\n", fpclassify(u.f), isnormal(u.f));
printf("\n");
u.i = 0x42a98001;
printf("%g\n", u.f);
printf("%g\n", 84.75000762939453125);
printf("%d %d\n", fpclassify(u.f), isnormal(u.f));
printf("\n");
u.f = 1.17549e-38;
printbits(u.i);
printf("%#010x\n", u.i);
printf("%d %d\n", fpclassify(u.f), isnormal(u.f));
u.f = 1.1754944e-38;
printbits(u.i);
printf("%#010x\n", u.i);
printf("%d %d\n", fpclassify(u.f), isnormal(u.f));
u.f = 1.1754945e-38;
printbits(u.i);
printf("%#010x\n", u.i);
printf("%d %d\n", fpclassify(u.f), isnormal(u.f));
}输出(在Ubuntu上,由gcc编译,处理器x86)是:
sizeof(float) = 4
sizeof(int) = 4
0 00000001 00000000000000000000001
1.17549e-38
4 1
0 00000001 00000000000000000000000
1.17549e-38
4 1
1.17549e-38
3 0
84.75
84.75
4 1
0 00000000 11111111111111111100001
0x007fffe1
3 0
0 00000001 00000000000000000000000
0x00800000
4 1https://stackoverflow.com/questions/49881930
复制相似问题