Java 按二进制创建浮点数

2021-11-16 20:57:47 +08:00
 Higurashi

整数可以这样初始化:int i = 0b0001;

我想类似地用二进制创建一个浮点数,所以我找到了 Float.intBitsToFloat(int) 方法,这样我就能够这样初始化一个浮点数:float f = Float.intBitsToFloat(0b0001);

但 Float.intBitsToFloat(int) 方法的注释中说:

"Note that this method may not be able to return a float NaN with exactly same bit pattern as the int argument."

所以,我想问是否有方法能够避免上面的“不足”,使我能够完全准确地用二进制初始化一个浮点数?

624 次点击
所在节点    问与答
10 条回复
OysterQAQ
2021-11-16 21:12:47 +08:00
自己再包一层 判断下介码全 0 和全 1 呗 不就解决了
Buges
2021-11-16 21:23:32 +08:00
如果你想从 byte 得到 float 的话,还需要考虑 endianess ,建议用专门的库。
Higurashi
2021-11-16 21:25:58 +08:00
@OysterQAQ #1
感谢回复。意思是判断指数位是否为全 1 ,全为 1 则给出提示?这似乎并没有真正在用二进制“初始化”浮点数。
OysterQAQ
2021-11-16 21:33:28 +08:00
@Higurashi 你看看 IEEE 754 浮点数的标准吧 第 1 位符号 然后 7 位介码(移码表示) 23 位的尾数(隐含了一位 1 ) 注释说没办法判断 NaN ,754 中的 NaN 指的就是介码全 1 尾数非 0 ,意思是你在用 Float.intBitsToFloat(0b0001)之前判断下 7 位介码就行了
OysterQAQ
2021-11-16 21:34:57 +08:00
@OysterQAQ 8 位介码
Higurashi
2021-11-16 21:43:03 +08:00
@OysterQAQ #4
我没把注释说清楚,这里的意思实际上是指,比如传入一个在 float 中为 NaN 的整数 0b01111111100000000000000000000001 ,虽然返回的浮点值为 NaN ,但它并不能**保证**这个 NaN 的位模式为 01111111100000000000000000000001 (除非自己亲自验证一下)。
Higurashi
2021-11-16 21:45:05 +08:00
@Buges #2
感谢回复。我会试试看,虽然似乎并不那么好找,因为我看见有些库里面也并没有处理这里的情况。
OysterQAQ
2021-11-16 21:52:18 +08:00
@Higurashi 这需求估计不被考虑吧 可能因为只要是 NaN 做什么运算都是一样的 代表无穷大了 可以先试试行不行
Higurashi
2021-11-16 21:59:44 +08:00
@OysterQAQ #8 嗯,的确不处理问题也不大。
Buges
2021-11-16 22:15:17 +08:00
@Higurashi

ByteBuffer.getFloat
DataInputStream.readFloat

这是处理二进制数据时非常常见的情况,不会不好找。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/815868

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX