gpt4 book ai didi

将小数转换为指数和尾数

转载 作者:太空宇宙 更新时间:2023-11-03 23:52:38 25 4
gpt4 key购买 nike

我正在尝试将十进制数 (329.39062) 转换为二进制数(指数,mentissa)。我不断收到段错误。在运行 gdb 测试时,它显示了 feof。我已经改变了很多,但它一直在同一点向我显示段错误。我哪里错了?感谢您提供的所有帮助。

#include <stdio.h>
#include <stdlib.h>

char* valueToConvert(int value);

int main(int argc, char *argv[])
{
FILE* input;
FILE* output;

input = fopen(argv[1],"r");
output = fopen(argv[2],"w");

float value;
unsigned char *charValue = (unsigned char *) &value;
int exponentValue;
long mantissaValue;

while(!feof(input))
{
fread(&charValue, sizeof(float),1, input);
exponentValue = ((charValue[0] & 0x7F) << 1)|((charValue[1] & 0x80) >> 7);
mantissaValue = ((charValue[1] & 0x7F) << 8)|((charValue[2] & 0xFF) <<8) | (charValue[3] & 0xFF);
fprintf(output,"%d %s %s\n",(charValue[0] & 0x80 >> 7),valueToConvert(exponentValue - 127),valueToConvert(mantissaValue));
}
}

char* valueToConvert(int value)
{
int counter = 0;
char* conversion = calloc(32,sizeof(int));
while(value>0)
{
if((value%2 == 1) && (value%2 != 0))
{
conversion[31 - counter++] = '1';
}
if((value%2 == 0) && (value%2 != 1))
{
conversion[31 - counter++] = '0';
}
value = value/2;
}
return conversion;
}

最佳答案

问题出在这里:

fread(&charValue, sizeof(float),1, input);

应该是

fread(charValue, sizeof(float),1, input);

因为charValue是一个指针。


为了解决您的输出问题,您在通过 calloc 使用 0 完全初始化缓冲区后向后填充缓冲区,因此 fprintf正在命中 0(用于表示字符串结尾的 char)并“过早”停止。

这是一个快速的二进制字符串函数:

void fast_d2b(int x, char* c) {
int i;
for (i = 31; i >= 0; --i) {
*(c++) = '0' + ((x >> i) & 0x1);
}
}

它基于显示的 here .唯一的区别是我的变体不会向后写入缓冲区,而是写入 '0''1' 而不是整数值 01

关于将小数转换为指数和尾数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15715622/

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