Java 中的 NaN 问题

发布于 2024-08-13 10:11:05 字数 568 浏览 7 评论 0原文

我将四个字节转换为浮点数,结果得到 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);
    }
}

I am converting four bytes to float and I'm getting NaN as a result, but I want the value 0.0. What am I doing wrong?

This is my code:

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);
    }
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

依 靠 2024-08-20 10:11:05

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

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

将数组更改为

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

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

Your main problem is that 0xFFFFFFFF is indeed a NaN.

A float with a value of 0 is... 0.

Changing the array to

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

Will change the resulting value to a 0.0f float.

月野兔 2024-08-20 10:11:05

好吧,你的位模式实际上恰好是 NaN:

IEEE 754 NaN 用指数字段表示,其中填充有 1 和一些非零值有效数中的数字。 IEEE 浮点标准单精度 NaN 的按位示例:x111 1111 1axx xxxx xxxx xxxx xxxx xxxx,其中 x 表示不关心。如果a = 1,则它是一个安静的NaN,否则它是一个信号NaN。

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

Well, your bit pattern happens to actually be NaN:

IEEE 754 NaNs are represented with the exponential field filled with ones and some non-zero number in the significand. A bit-wise example of a IEEE floating-point standard single precision NaN: x111 1111 1axx xxxx xxxx xxxx xxxx xxxx where x means don't care. If a = 1, it is a quiet NaN, otherwise it is a signalling NaN.

Since all your bits are 1, it obviously fits above criteria and is a quiet NaN (although Java iirc doesn't even support quiet or signalling NaNs).

歌入人心 2024-08-20 10:11:05

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

NaN = Not a Number, iaw, the bit pattern 0xFFFFFFFF does not represent a float value number. (Joachim, you're right .. again :-) )

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文