Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/391.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java DataInputStream有时读取NaN而不是浮点_Java_Android - Fatal编程技术网

Java DataInputStream有时读取NaN而不是浮点

Java DataInputStream有时读取NaN而不是浮点,java,android,Java,Android,有点像Java新手。编写STL文件查看器。我使用DataInputStream从二进制文件读取浮点值,但随机获取一些值的NaN。该文件在STL文件读取器中在PC上打开时似乎完好无损,但我得到的NaN值意味着文件中有相当多的面已损坏。什么情况会导致DataInputStream返回NaN 我的代码似乎工作得很好,正是这些随机的NaN让我发疯。这是一个截短版的阅读代码——我认为这一切都很简单。非常感谢您的帮助: public static int GetFacetBinary(DataInputSt

有点像Java新手。编写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>
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个字节