如何查找for (String key: params.keySet()) {
// field name key, field value is params.get(key)
}
和float
类型的内存格式?
我的意思是符号,指数和分数的位数。
答案 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。