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,现在不需要,所以我想它不会慢很多。
答案 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。
所以,你可能正在阅读无效的浮点数。