如何测试文件存储的浮点表示
How can one test floating point representation for file storage?
我有科学数据转储到文件中。目前,我只是以它们在内存中相同的表示方式转储它们。我已经记录了它们是IEEE754,但我希望在代码中声明这一点,这样如果它被移植到一个奇怪的架构并与我的文档分离(研究代码被传递),它就会在编译时出错。现在我有
static_assert(sizeof(double)==8), "message");
是否有测试IEEE754的方法?这是静态的断言吗?
在C语言中,检查是否定义了:
__STDC_IEC_559__
在c++中,检查这是否为true
:
std::numeric_limits<double>::is_iec559()
IEC559是国际电工委员会标准559的缩写,与IEEE 754相同。
c++的答案在这里:如何检查c++编译器是否使用IEEE 754浮点数标准
对于C语言,现行C语言标准附录F规定,如果平台符合IEEE 754浮点运算规范,则预处理器常数__STDC_IEC_559__
将被预定义为值1
。但是旧的C编译器可能不会预先定义它,即使浮点数确实是IEEE 754。
然而,这对两种语言都是不够的:这种一致性只保证IEEE 754的语义,而不是二进制表示,并且由于您将二进制表示转储到文件中,您还需要处理端序问题。由于整数的端序可能与浮点数的端序不同,因此它变得更加复杂。
最后,如果您希望在现在和将来的各种平台之间实现可移植性,那么最好使用文本表示来存储浮点值。当然,您需要使用这种表示的最大精度。
http://hdfgroup.org提供了另一个解决方案,它可以有效地处理大量数据的这个问题。
您可以使用std::numeric_limits<double>
的is_iec559
-参见此处
相关文章:
- 表示"accepting anything for this template argument" C++概念的通配符
- 将字符串存储在c++中的稳定内存中
- std::原子加载和存储都需要吗
- C++:将控制台输出存储在宏中更好吗
- 如何将ampl中的集合表示为c++中的向量
- std::is_base_of表示ctor编译错误
- 输入中的字符串数未知(以字母表示)
- 使用QProcess执行命令,并将结果存储在QStringList中
- 我可以信任表示整数的浮点或双精度来保持精度吗
- 访问存储在向量C++中的结构的多态成员
- 如何从存储在std::映射中的std::集中删除元素
- 在 std::无符号字符的向量处存储 int 的十六进制表示形式
- 访问表示 2D 矩阵的 1D 存储数组
- 指向对象表示元素或指向提供的存储元素的指针
- 查找存储在长位中的最后一个int(1-9)(每个int由4位表示)
- 存储位置和数据类型的表示形式
- BigInt实现-将字符串转换为存储为无符号int的二进制表示
- 我如何表示一个在c++中只存储0或1的数组[100000][100000]
- 如何获取特殊字符输入并存储在字符或字符串变量中?特殊字符表示©或 ž
- 如何测试文件存储的浮点表示