C语言中的IEEE 754转十进制
IEEE 754 to decimal in C language
我正在寻找将浮点数转换为其在 C 中的十进制表示的最佳方法。我将尝试给您举个例子:用户在 IEEE754 中引入一个数字 (1 1111111 10101...) 并且程序必须 return 十进制表示法(例如 25.6)
我试过掩码和按位运算,但没有得到任何合乎逻辑的结果。
我相信以下操作正在执行您描述的操作:
我使用 int
作为中间表示,因为它与浮点数(在我的机器上)具有相同的位数,并且它允许从二进制字符串轻松转换。
#include <stdio.h>
union {
int i;
float f;
} myunion;
int binstr2int(char *s)
{
int rc;
for (rc = 0; '[=10=]' != *s; s++) {
if ('1' == *s) {
rc = (rc * 2) + 1;
} else if ('0' == *s) {
rc *= 2;
}
}
return rc;
}
int main(void) {
// the input binary string (4 bytes)
char * input = "11000000110110011001100110011010";
float *output;
// convert to int, sizeof(int) == sizeof(float) == 4
int converted = binstr2int(input);
// strat 1: point memory of float at the int
output = (float*)&converted; // cast to suppress warning
printf("%f\n", *output); // -6.8
// strat 2: use a union to share memory
myunion.i = converted;
printf("%f\n", myunion.f); // -6.8
return 0;
}
正如@DanielKamilKozar 指出的那样,int
的正确类型是 uint32_t
。但是,这需要包括 <stdint.h>
.
我正在寻找将浮点数转换为其在 C 中的十进制表示的最佳方法。我将尝试给您举个例子:用户在 IEEE754 中引入一个数字 (1 1111111 10101...) 并且程序必须 return 十进制表示法(例如 25.6)
我试过掩码和按位运算,但没有得到任何合乎逻辑的结果。
我相信以下操作正在执行您描述的操作:
我使用 int
作为中间表示,因为它与浮点数(在我的机器上)具有相同的位数,并且它允许从二进制字符串轻松转换。
#include <stdio.h>
union {
int i;
float f;
} myunion;
int binstr2int(char *s)
{
int rc;
for (rc = 0; '[=10=]' != *s; s++) {
if ('1' == *s) {
rc = (rc * 2) + 1;
} else if ('0' == *s) {
rc *= 2;
}
}
return rc;
}
int main(void) {
// the input binary string (4 bytes)
char * input = "11000000110110011001100110011010";
float *output;
// convert to int, sizeof(int) == sizeof(float) == 4
int converted = binstr2int(input);
// strat 1: point memory of float at the int
output = (float*)&converted; // cast to suppress warning
printf("%f\n", *output); // -6.8
// strat 2: use a union to share memory
myunion.i = converted;
printf("%f\n", myunion.f); // -6.8
return 0;
}
正如@DanielKamilKozar 指出的那样,int
的正确类型是 uint32_t
。但是,这需要包括 <stdint.h>
.