C 如何将浮点值准确写入bin文件
我正在尝试将浮点值从程序转储到bin文件。因为我不能使用任何stdlib函数,所以我正在考虑将它逐字符写入一个大的字符数组,并在测试应用程序中将其转储到一个文件中 就像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
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);
}