Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何将浮点值准确写入bin文件_C_String_File Io_Floating Point - Fatal编程技术网

C 如何将浮点值准确写入bin文件

C 如何将浮点值准确写入bin文件,c,string,file-io,floating-point,C,String,File Io,Floating Point,我正在尝试将浮点值从程序转储到bin文件。因为我不能使用任何stdlib函数,所以我正在考虑将它逐字符写入一个大的字符数组,并在测试应用程序中将其转储到一个文件中 就像 float a=3132.000001; 我将把它转储到4字节的字符数组中 代码示例为:- if((a < 1.0) && (a > 1.0) || (a > -1.0 && a < 0.0)) a = a*1000000 // 6 bit fraction pa

我正在尝试将浮点值从程序转储到bin文件。因为我不能使用任何stdlib函数,所以我正在考虑将它逐字符写入一个大的字符数组,并在测试应用程序中将其转储到一个文件中

就像

float a=3132.000001;
我将把它转储到4字节的字符数组中

代码示例为:-

if((a < 1.0) && (a > 1.0) || (a > -1.0 && a < 0.0))
    a = a*1000000 // 6 bit fraction part.
if((a<1.0)和&(a>1.0)|(a>-1.0和&a<0.0))
a=a*1000000//6位小数部分。

你能帮我写得更好吗?

如果你打算在同一个架构上读回同一个程序(没有端点问题),直接把数字写出来:

fwrite(&a, sizeof(a), 1, f);
或者使用memcpy将其复制到中间缓冲区:

memcpy(bufp, &a, sizeof(a));
bufp += sizeof(a);
如果你必须处理持久性问题,你可能会偷偷摸摸。将浮子铸造为长形,并使用htonl:

assert(sizeof(float) == sizeof(long)); // Just to be sure
long n = htonl(*(long*)&a);
memcpy(bufp, &n, sizeof(n));
bufp += sizeof(n);
读回:

assert(sizeof(float) == sizeof(long)); // Just to be sure
long n;
memcpy(&n, bufp, sizeof(n));
n = ntohl(n);
a = *(float*)n;
bufp += sizeof(n);
使用

符号被捕捉在尾数中。这应该正确地处理非规范化,而不是无限或NaN

写入
指数
尾数
必然需要超过4个字节,因为隐式尾数位是显式的。如果您想将浮点作为原始数据写入,那么问题根本不是关于浮点,而是处理原始数据和endianness

在另一端,使用


如果您可以使用标准库,则有一个格式说明符仅用于此:
%a
。但也许你认为<代码> FRXP < /代码>也是标准库。不清楚。

如果您不担心读写器之间的平台差异:

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

...

union float_bytes {
    float val;
    uint8_t a[sizeof(float)]; // This type can be unsigned char if you don't have stdint.h
};

size_t float_write(FILE * outf, float f) {
   union float_bytes fb = { .val = f };
   return fwrite(fb.a, sizeof(float), outf);
}
#包括
#包括
#包括
...
联合浮点字节{
浮动增值税;
uint8_t a[sizeof(float)];//如果没有stdint.h,则此类型可以是无符号字符
};
大小\u t浮点\u写入(文件*outp,浮点f){
联合浮点_字节fb={.val=f};
返回fwrite(fb.a、sizeof(浮动)、输出);
}
将浮点转换为字节数组的方法较短,但它们涉及更多的类型转换,并且更难读取。其他这样做的方法可能不会使编译代码更快或更小(尽管联合会会使调试代码更大)


如果您试图以独立于平台的方式存储浮点数,那么最简单的方法就是将其存储为字符串(后面有很多数字)。更困难的是选择一个浮点位布局来使用,并在读写时将所有浮点转换成该格式。可能只是选择某个宽度和某个端点的IEEE浮点,并坚持使用它

马塞洛,你能扩展你的答案来解决endianness问题吗?提前谢谢。
#include <stdlib.h>
#include <stdint.h>
#include <stdio.h>

...

union float_bytes {
    float val;
    uint8_t a[sizeof(float)]; // This type can be unsigned char if you don't have stdint.h
};

size_t float_write(FILE * outf, float f) {
   union float_bytes fb = { .val = f };
   return fwrite(fb.a, sizeof(float), outf);
}