Higurashi
V2EX  ›  问与答

Java 按二进制创建浮点数

  •  
  •   Higurashi · Nov 16, 2021 · 1015 views
    This topic created in 1663 days ago, the information mentioned may be changed or developed.

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

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

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

    ByteBuffer.getFloat
    DataInputStream.readFloat

    这是处理二进制数据时非常常见的情况,不会不好找。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   2863 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 43ms · UTC 02:49 · PVG 10:49 · LAX 19:49 · JFK 22:49
    ♥ Do have faith in what you're doing.