【问题标题】:NaN problem in JavaJava中的NaN问题
【发布时间】:2023-03-19 04:24:01
【问题描述】:

我将四个字节转换为浮点数,结果得到NaN,但我想要0.0 的值。我做错了什么?

这是我的代码:

public class abc 
{
    public static void main(String[] args) 
    {
        int[] arry = { 255, 255, 255, 255 };
        int num = ((arry[0] << 24) & 0xFF000000) | ((arry[1] << 16) & 0xFF0000)
            | ((arry[2] << 8) & 0xFF00) | (arry[3] & 0xFF);
        float f = Float.intBitsToFloat(num);

        f= (float) ((f < 0 ? Math.ceil(f * 10) : Math.floor(f * 10)) / 10);

        System.out.println(f);
    }
}

【问题讨论】:

  • 这个问题的上下文是什么?

标签: java floating-point core nan


【解决方案1】:

您的主要问题是 0xFFFFFFFF 确实是 NaN。

值为 0 的浮点数是... 0。

将数组更改为

int[] arry = { 0x00, 0x00, 0x00, 0x00 };

将结果值更改为 0.0f 浮点数。

【讨论】:

    【解决方案2】:

    嗯,你的位模式恰好是 NaN:

    IEEE 754 NaN 用填充了 1 和有效数字中的一些非零数字的指数字段表示。 IEEE floating-point 标准单精度 NaN 的按位示例:x111 1111 1axx xxxx xxxx xxxx xxxx xxxx 其中 x 表示 don't care。如果a = 1,它是一个安静的NaN,否则它是一个信号NaN。

    由于所有你的位都是 1,它显然符合上述标准并且是 quiet NaN(尽管 Java iirc 甚至不支持安静或信号 NaN)。

    【讨论】:

      【解决方案3】:

      NaN = Not a Number,iaw,位模式 0xFFFFFFFF 不代表 float value 数字。 (约阿希姆,你是对的......再次:-))

      【讨论】:

      • NaN 是一个浮点值,否则无法将其存储在 float 变量中。这不是一个数字;-)
      • 您期望哪个值,什么是“正确”?如果你想要'0.0f',那么使用 {0,0,0,0} int 数组。如果你想要 0xffffffff 对应的浮点数,那么只需转换 (float f = (float) num)
      猜你喜欢
      • 2023-04-05
      • 2016-12-31
      • 2021-10-21
      • 2012-11-08
      • 2011-03-12
      • 2017-10-23
      • 2022-01-11
      • 2017-08-23
      • 1970-01-01
      相关资源
      最近更新 更多