DataInputStream有时会读取NaN而不是float

时间:2011-07-21 09:16:08

标签: java android

Java newb的一点点。编写STL文件查看器。我正在使用DataInputStream从二进制文件中读取浮点数,但在某些值上随机获取NaN。该文件在STL文件读取器中的PC上打开时似乎完好无损,但是我得到的NaN值意味着文件中的一些方面已经损坏。什么情况可能导致DataInputStream返回NaN?

我的代码似乎工作正常,只是这些随机的NaN让我发疯。这是阅读代码的截断版本 - 我认为非常简单。非常感谢任何帮助:

public static int GetFacetBinary(DataInputStream in, ArrayList al, ArrayList aln) {

        <snip>

        // read 1st vertex
        fxr = in.readFloat();
        f1x = swap(fxr);
        al.add(f1x);
        if (fminx > f1x) fminx = f1x;
        if (fmaxx < f1x) fmaxx = f1x;

        fyr = in.readFloat();
        f1y = swap(fyr);
        al.add(f1y);
        if (fminy > f1y) fminy = f1y;
        if (fmaxy < f1y) fmaxy = f1y;

        fzr = in.readFloat();
        f1z = swap(fzr);
        al.add(f1z);
        if (fminz > f1z) fminz = f1z;
        if (fmaxz < f1z) fmaxz = f1z;

        iVertCount++;
                    <snip>

编辑:找到一个解决方法,但仍然不知道为什么readFloat偶尔会返回NaN。我仍然对这个问题的答案感兴趣。现在我读取了四个字节,将它们移位,将其转换为浮点数并且它完美地运行:

in.readFully(fourbytes);
v1  = ((fourbytes[3]&0xff) << 24) | ((fourbytes[2]&0xff) << 16) | 
      ((fourbytes[1]&0xff) << 8) | ((fourbytes[0]&0xff) << 0);
f1x = Float.intBitsToFloat(v1);

我之后正在进行转换以转换endianness,现在不需要,所以我想它不会慢很多。

2 个答案:

答案 0 :(得分:0)

如果我没有误会,我认为NaN代表“Not a Number”,因此从STL文件中读取可能会完美无缺,但解析该值可能会由于多种原因而失败。

自发地我认为你正在尝试从文件中解析一个空字符串(通过in.readFloat()行),但它可能是任何其他无法解析为浮点数的字符串(如“abc”或也许甚至是“1,3” - 而不是“1.3”)。

我不知道“STL文件”是什么或它是如何构建的,但有没有保证您正在阅读的值总是可以解析为浮点值?

答案 1 :(得分:0)

DataInputStream使用Float.intBitsToFloat(bytes)将数字转换为float。它的文档说明:

  

如果参数是0x7f800001到0x0f800001范围内的任何值   0x7fffffff或在0xff800001到0xffffffff范围内,结果   是NaN。

所以,你可能正在阅读无效的浮点数。