Bob*_*Fet 13 c c# c++ java static-typing
使用float类型比使用double类型慢吗?
我听说现代的Intel和AMD CPU可以比使用浮点数更快地进行双倍计算.
什么标准的数学函数(sqrt,pow,log,sin,cos,等)?以单精度计算它们应该相当快,因为它应该需要更少的浮点运算.例如,单精度sqrt可以使用比双精度更简单的数学公式sqrt.另外,我听说标准数学函数在64位模式下更快(在64位操作系统上编译和运行时).对此有何明确答案?
AnT*_*AnT 11
经典的x86架构使用浮点单元(FPU)来执行浮点计算.FPU在其内部寄存器中执行所有计算,每个寄存器具有80位精度.每次尝试使用float或时double,变量首先从内存加载到FPU的内部寄存器中.这意味着实际计算的速度绝对没有差异,因为在任何情况下,计算都以完全80位精度执行.唯一可能不同的是从内存加载值并将结果存储回内存的速度.当然,在32位平台上,可能需要更长的时间来加载/存储一double比float.在64位平台上应该没有任何区别.
现代x86架构支持带有新指令的扩展指令集(SSE/SSE2),这些指令可以执行完全相同的浮点计算,而不涉及"旧的"FPU指令.然而,再次,我不希望看到float和的计算速度有任何差异double.由于这些现代平台是64位的,因此加载/存储速度应该是相同的.
在不同的硬件平台上,情况可能会有所不同.但通常较小的浮点类型不应提供任何性能优势.较小的浮点类型的主要目的是节省内存,而不是提高性能.
编辑:(解决@MSalters评论)我上面所说的内容适用于基本的算术运算.说到库函数,答案取决于几个实现细节.如果平台的浮点指令集包含实现给定库函数的功能相关的指令,那么我上面说的,通常会应用到的功能,以及(通常会包括像功能sin,cos,sqrt).对于FP指令集中不立即支持其功能的其他功能,情况可能会有很大差异.float这些功能的版本很可能比它们的double版本更有效地实现.