在什么情况下在Java中使用浮点数更好?

Jul*_*ian 11 java double performance

更具体地说,在Java中使用float而不是double时,性能有多大?

mik*_*era 11

通常情况下,我会使用a double,因为float对于许多数字用例来说没有足够的准确性,并且性能差异小到不重要.

与往常一样,性能取决于实现,因此您需要对特定情况进行基准测试,以确定它是否"重要".

一般来说,我发现:

  • 单个操作的性能差异非常小,尤其是在64位计算机上.a float和a long都适合64位机器字.通常没有差别.
  • float它有一点点优势,因为它们消耗更少的内存,这有助于降低CPU缓存压力.我发现在对大型阵列进行简单操作时浮动速度要快30-50%.


nic*_*o_c 11

由于您的问题主要是关于性能,本文将向您介绍一些特定的计算(请记住,尽管本文特定于神经网络,您的计算可能与他们在文章中所做的完全不同):http: //web.archive.org/web/20150310213841/http://www.heatonresearch.com/content/choosing-between-java%E2%80%99s-float-and-double

链接中的一些相关材料在此处转载:

double和float都可以支持相对较大的数字.上下范围实际上不是神经网络的考虑因素.Float可以处理1.40129846432481707e-45到3.40282346638528860e + 38之间的数字......基本上,float可以处理大约7位小数.双精度可以处理大约16位小数.

矩阵乘法是神经网络编程最常用的数学运算之一.绝不是唯一的操作,但它将提供一个很好的基准.以下程序将用于对双精度进行基准测试.

跳过所有代码,网站上的表格显示,对于100x100矩阵乘法,如果他们使用双精度,他们的性能增益约为10%.对于500x100矩阵乘法,由于使用双精度而导致的性能损失约为7%.对于1000x1000矩阵乘法,该损失约为17%.

对于小型100x100矩阵,切换到浮点实际上可能会降低性能.随着矩阵的大小增加,增益百分比增加.使用非常大的矩阵,性能提升增加到17%.17%值得考虑.