查找浮点类型的内存格式

时间:2017-03-03 16:19:57

标签: c++ floating-point

如何查找for (String key: params.keySet()) { // field name key, field value is params.get(key) } float类型的内存格式?

我的意思是符号,指数和分数的位数。

2 个答案:

答案 0 :(得分:2)

  

我的意思是符号,指数和分数的位数。

您可以使用std::numeric_limits<T>::digits获取尾数位,std::numeric_limits<T>::is_signed来获取符号位。

您并从sizeof(T)*CHAR_BIT中扣除它们的总和以猜测指数位数,但如果类型具有填充,则可能不正确。这对于long double来说是典型的。

  

查找浮点类型的内存格式

当然,不仅位数很重要,而且顺序也很重要。这些功能对您没有帮助。他们还假设std::numeric_limits<T>::radix == 2

对于确切的格式,您必须参考cpu architechture的手册。

  

我想将浮点数保存到硬盘,并想知道是否有一种很好的方法可以使文件跨平台。

最典型的解决方案是在保存到磁盘时将浮点转换为文本表示:0x1.8p+0。它不是最有效的,但它是可移植的(尽管如此,你必须决定文件将使用哪种字符编码,如果这不是系统本机的,则需要进行转换)。 / p>

答案 1 :(得分:1)

要以跨平台方式将浮点数保存到磁盘,请查找我的github项目

https://github.com/MalcolmMcLean/ieee754

我还提供了便于读取二进制整数的函数,因为它比初看起来稍微复杂一些。

如果要测试内存格式,则需要创建具有某些策略值的浮点数,然后查询位模式。零应该是所有位零和一个特殊情况,除非你在奇怪和奇妙的硬件上。 1和-1应该相差一位,这是你的位符号。 2和1应该在指数上有所不同,并且2的测试功率应该告诉你指数位以及它们何时耗尽。为速度测试2的幂次幂。

然后你可以通过将2的幂存储1来获得尾数,例如3,7等等。

通过探测,你可以建立一个记忆模式,但它几乎总是IEEE 754。