gpt4 book ai didi

c - 4字节(32位)的IEEE 754算术

转载 作者:行者123 更新时间:2023-11-30 15:59:18 25 4
gpt4 key购买 nike

我编写此代码是为了对 4 字节字符串执行 IEEE 754 浮点运算。

它接收字节,将它们转换为二进制,通过二进制我得到符号、指数和尾数,然后进行计算。

一切都非常完美,0xDEADBEEF给了我6259853398707798016,真正的答案是6.259853398707798016E18,现在这些是相同的值,我正在处理的项目中不会有这么大的东西,所有其他较小的值都放在小数点上在正确的位置。

这是我的代码: 浮点 calcByteValue(uint8_t data[]) { 整数我; 整数 j = 0; 整数索引; int 符号,exp; 漂浮曼特;

   char bits[8] = {0};
int *binary = malloc(32*sizeof *binary);
for (index = 0;index < 4;index++) {
for (i = 0;i < 8;i++,j++) {
bits[i] = (data[index] >> 7-i) & 0x01;
if (bits[i] == 1) {
binary[j] = 1;
} else {
binary[j] = 0;
}
}
printf("\nindex(%d)\n", index);
}

sign = getSign(&(binary[0]));
mant = getMant(&(binary[0]));
exp = getExp(&(binary[0]));

printf("\nBinary: ");
for (i = 0;i < 32;i++)
printf("%d", binary[i]);
printf("\nsign:%d, exp:%d, mant:%f\n",sign, exp, mant);

float f = pow(-1.0, sign) * mant * pow(2,exp);
printf("\n%f\n", f);
return f;
}

//-------------------------------------------------------------------

int getSign(int *bin) {
return bin[0];
}

int getExp (int *bin) {
int expInt, i, b, sum;
int exp = 0;

for (i = 0;i < 8;i++) {
b = 1;
b = b<<(7-i);
if (bin[i+1] == 1)
exp += bin[i+1] * b;
}

return exp-127;

}

float getMant(int *bin) {
int i,j;
float b;
float m;
int manBin[24] = {0};
manBin[0] = 1;
for (i = 1,j=9;j < 32;i++,j++) {
manBin[i] = bin[j];
printf("%d",manBin[i]);
}
for (i = 0;i < 24;i++) {
m += manBin[i] * pow(2,-i);;
}
return m;
}

现在,我的老师告诉我,有一种更简单的方法,我可以只接受字节流,并将其转换为 float ,它应该可以工作。我尝试这样做,但无法弄清楚我的生活是否取决于它。

我不是要求你为我做作业,我已经完成并正在工作,但我只需要知道我是否可以以不同的方式/更简单/更有效地完成它。

编辑:我需要处理一些特殊情况,但这只是指数全为零之类的事情。易于实现。

最佳答案

老师可能是这么想的:

char * str; // your deadbeef
float x;
memcpy(&x, str, sizeof(float));

由于字节序问题,我建议不要这样做。但如果你的老师想要它,他就会得到它。

关于c - 4字节(32位)的IEEE 754算术,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9081575/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com