java具有浮点基元类型的目的是什么?

java具有浮点基元类型的目的是什么?,java,floating-point,double,Java,Floating Point,Double,你能帮我澄清一下float原语在Java中的用法吗 我的理解是,将浮点值转换为双倍,反之亦然可能会有问题。我读到(很久以前,不确定新JVM是否真的如此)float的性能比double差很多。当然,浮点数的精度比double低 我还记得,当我使用AWT和Swing时,我在使用float或double时遇到了一些问题(比如使用Point2D.float或Point2D.double) 因此,我只看到浮动优于双精度的两个优点: 它只需要4个字节,而double需要8个字节 Java内存模型(JavaM

你能帮我澄清一下float原语在Java中的用法吗

我的理解是,将浮点值转换为双倍,反之亦然可能会有问题。我读到(很久以前,不确定新JVM是否真的如此)float的性能比double差很多。当然,浮点数的精度比double低

我还记得,当我使用AWT和Swing时,我在使用float或double时遇到了一些问题(比如使用Point2D.float或Point2D.double)

因此,我只看到浮动优于双精度的两个优点:

  • 它只需要4个字节,而double需要8个字节

  • Java内存模型(JavaMemoryModel,JMM)保证赋值操作对于浮点变量是原子的,而对于双精度变量则不是原子的


  • 是否有其他情况下浮动比双精度更好?您在应用程序中使用float吗

    你刚才给出的两个理由是巨大的

    如果你有一个1k乘1k乘64的3D体积,然后有很多数据的时间点,然后想制作一部最大强度投影的电影,事实上float是double大小的一半,这可能是快速完成和抖动之间的区别,因为内存不足

    从线程的角度来看,原子性也是巨大的


    在速度/性能和准确性之间总会有一个折衷。如果您有一个小于2^31的数字和一个整数,那么整数总是比浮点更好地表示该数字,这只是因为精度损失。您必须评估您的需求,并针对您的问题使用适当的类型。

    因此,是的,浮动的优点:

  • 只需要4个字节
  • 原子赋值
  • 算术应该更快,特别是在32位体系结构上,因为有特定的浮点字节码 使用双精度时缓解这些问题的方法:

  • 多买些公羊,真的很便宜
  • 如果需要原子赋值,请使用volatile double
  • 做测试,验证每一个的性能,如果一个真的更快,你就没有什么可以做的了

  • 还有人提到这类似于short vs int参数,但事实并非如此。除long之外的所有整数类型(包括boolean)在Java内存模型中都存储为4字节整数,除非存储在数组中。

    我想你提到存储时就把它搞定了,浮点数是大小的一半

    对于处理大型浮点数数组的应用程序,使用浮点数可能会显示出比双倍数更好的性能,因此内存带宽是限制因素。通过从
    double[]
    切换到
    float[]
    并将数据大小减半,可以有效地将吞吐量提高一倍,因为在给定的时间内可以获取两倍的值。虽然cpu需要做更多的工作来将浮点值转换为双精度值,但这与内存提取并行进行,提取时间更长


    对于某些应用程序,精度的损失可能值得用性能的提高来换取。然后再次…:-)

    包含浮点类型的原因在某种程度上是历史性的:它代表了一种标准的IEEE浮点表示法,从那时起,将浮点数的大小减少4个字节以换取极低的精度是一种值得权衡的选择

    如今,浮动的用途相当有限。但是,例如,拥有数据类型可以更容易地编写需要与使用float的旧系统进行互操作的代码

    就性能而言,我认为float和double本质上是相同的,除了分区的性能。通常,无论使用哪种格式,处理器都会转换为其内部格式,进行计算,然后再转换回来,而实际计算实际上需要固定的时间。在除法的情况下,至少在英特尔处理器上,正如我所记得的,除法所花费的时间通常是每2位精度一个时钟周期,因此,使用浮点还是双精度确实会有所不同


    除非您真的有充分的理由使用它,否则在新代码中,我通常会避免使用“float”。

    在某些情况下,double可能比float的运算速度更快。但是,这要求所有内容都适合一级缓存。使用浮点数,缓存线中的数据量可以增加一倍。这可以使一些程序的运行速度几乎提高一倍


    SSE指令也可以并行处理4个浮点而不是2个浮点,但我怀疑JIT是否真的使用了这些浮点。不过我可能错了。

    “在我看来,java拥有浮点的唯一有价值的原因是向后兼容性。”你在前面列出了
    float
    …蛊惑人心的两个优点时这么说?也许他可以说得更好(“何时使用
    float
    而不是
    double
    ?”),但蛊惑人心?如果int的范围更大,短于int有什么好处?这里的答案是一样的。@Travis G:1)我认为(也许我错了!)在生产系统中,我们负担不起双倍数组,但我们可以冒险使用浮点数数组,这种情况非常罕见。2)AtomicDouble可以用于多线程应用程序。@jweyrich:我只是说赋值操作。阅读这里的第8.4项:作为字段,整数类型都需要4字节,但当存储为数组时则不需要。例如,短[]每个索引需要2个字节。是的,非常正确。(除了long,它实际上存储在两个插槽中)。值得注意的是,在英特尔CPU上,内部表示为80位,这与32位
    浮点和64位
    双精度
    都不同。所以在这两种情况下都会发生转换。是的,绝对——对不起,当我说“无论使用哪种[…]转换为其内部格式”时,我认为这一点很清楚。但是,是的,我完全同意。MP3的存在在某种程度上是历史性的