Java DataInputStream有时读取NaN而不是浮点
有点像Java新手。编写STL文件查看器。我使用DataInputStream从二进制文件读取浮点值,但随机获取一些值的NaN。该文件在STL文件读取器中在PC上打开时似乎完好无损,但我得到的NaN值意味着文件中有相当多的面已损坏。什么情况会导致DataInputStream返回NaN 我的代码似乎工作得很好,正是这些随机的NaN让我发疯。这是一个截短版的阅读代码——我认为这一切都很简单。非常感谢您的帮助:Java DataInputStream有时读取NaN而不是浮点,java,android,Java,Android,有点像Java新手。编写STL文件查看器。我使用DataInputStream从二进制文件读取浮点值,但随机获取一些值的NaN。该文件在STL文件读取器中在PC上打开时似乎完好无损,但我得到的NaN值意味着文件中有相当多的面已损坏。什么情况会导致DataInputStream返回NaN 我的代码似乎工作得很好,正是这些随机的NaN让我发疯。这是一个截短版的阅读代码——我认为这一切都很简单。非常感谢您的帮助: public static int GetFacetBinary(DataInputSt
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>
public static int GetFacetBinary(DataInputStream-in、ArrayList-al、ArrayList-aln){
//读取第一个顶点
fxr=in.readFloat();
f1x=互换(fxr);
al.添加(f1x);
如果(fminx>f1x)fminx=f1x;
如果(fmaxxf1y)fminy=f1y;
如果(fmaxyf1z)fminz=f1z;
如果(fmaxz
编辑:找到了一个解决方法,但仍然不知道为什么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);
in.可读(四字节);
v1=((fourbytes[3]&0xff)如果我没有弄错的话,我认为NaN代表“不是一个数字”,因此从STL文件读取可能工作得很完美,但是解析值可能会由于许多原因而失败
我自然而然地认为您正在尝试解析文件中的空字符串(通过.readFloat()中的in
行),但可能是无法解析为float的任何其他内容(例如“abc”或甚至“1,3”-而不是“1.3”)
我不知道“STL文件”是什么,也不知道它是如何构建的,但是否可以保证您正在读取的值始终可以解析为浮点值?DataInputStream使用float.intBitsToFloat(字节)将数字转换为浮点值。文档说明:
如果参数是0x7f800001到0x7f800001范围内的任何值
0x7fffffff或0xff800001到0xffffffff范围内的结果
他是一个奶奶
因此,可能您读取的是无效的浮点数。是的,NaN不是一个数字。我正在读取一个二进制文件,该值直接进入浮点,因此无需解析。所有其他值都可以完美读取,只有少数值是NaN。STL文件描述了三角形网格,但这并不重要,因为该文件可以成功地被读取ead被其他软件读取。我只是需要一些提示,为什么DataInputStream可能会给我一个NaN而不是一个有效的浮点值。是的,如果它是一个二进制文件,那么可以公平地假设没有“要浮点的字符串”解析:-)不幸的是,我没有任何关于可能导致错误的进一步想法:-(甜心。你知道如果一个人试着把它读成一个双精度,然后把双精度转换成浮动(如果有必要的话)会有什么不同吗)?数字非常小,例如在一些失败的文件中,一组是-0.5到+0.5,另一组是+0.25到+300.0,所以在浮点范围内。正如dbm所说,虽然我将快速测试读取一个双精度并将其转换为浮点。Doh,当然我不能读取双精度,因为文件中只存储浮点。我想我可以读取四个b是的,并从中派生出浮点值?至少你可以在调试中运行它,看看你在读什么,可能你读不到一些值,所以丢失了浮点值的实际偏移量。他不能把它作为双值来读,因为它是二进制格式,他必须为它读4个字节