V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
Higurashi
V2EX  ›  问与答

Java 按二进制创建浮点数

  •  
  •   Higurashi · 2021-11-16 20:57:47 +08:00 · 627 次点击
    这是一个创建于 1106 天前的主题,其中的信息可能已经有所发展或是发生改变。

    整数可以这样初始化: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."

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

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

    ByteBuffer.getFloat
    DataInputStream.readFloat

    这是处理二进制数据时非常常见的情况,不会不好找。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5177 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 09:42 · PVG 17:42 · LAX 01:42 · JFK 04:42
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.