浮动比两倍慢吗? 64位程序的运行速度是否快于32位程序?

| 使用
float
型比使用
double
型慢吗? 我听说现代的Intel和AMD CPU的计算速度比float快一倍。 标准数学函数(
sqrt
pow
log
sin
cos
等)怎么样?单精度计算它们应该更快,因为它需要更少的浮点运算。例如,单精度
sqrt
可以使用比双精度use2ѭ更简单的数学公式。另外,我听说标准数学函数在64位模式下(在64位OS上编译并运行时)速度更快。对此的明确答案是什么?     
已邀请:
经典的x86体系结构使用浮点单元(FPU)来执行浮点计算。 FPU在其内部寄存器中执行所有计算,每个内部寄存器具有80位精度。每次尝试使用
float
double
时,该变量首先从内存加载到FPU的内部寄存器中。这意味着实际计算的速度绝对没有差异,因为在任何情况下,计算都是以全80位精度进行的。唯一可能不同的是从内存加载值并将结果存储回内存的速度。自然地,在32位平台上,加载/存储ѭ1可能比ѭ0花费更长的时间。在64位平台上应该没有任何区别。 现代x86架构通过新指令支持扩展指令集(SSE / SSE2),这些指令集可以执行完全相同的浮点计算,而无需使用“旧” FPU指令。但是,我也不会期望
float
double
的计算速度有任何差异。并且由于这些现代平台是64位平台,因此加载/存储速度也应该相同。 在不同的硬件平台上,情况可能有所不同。但是通常较小的浮点类型不应提供任何性能优势。较小的浮点类型的主要目的是节省内存,而不是提高性能。 编辑:(以解决@MSalters的评论) 我上面所说的适用于基​​本算术运算。对于库函数,答案将取决于几个实现细节。如果平台的浮点指令集包含实现给定库函数功能的指令,那么我上面所说的内容通常也适用于该函数(通常包括
sin
cos
sqrt
之类的函数) 。对于FP指令集中未立即支持其功能的其他功能,情况可能被证明有很大不同。这种功能的“ 0”版本比“ 1”版本更有效地实现。     
您的第一个问题已在此处回答。 您的第二个问题完全取决于您正在处理的数据的“大小”。一切都归结为系统的低级体系结构以及它如何处理较大的值。在32位系统中,64位数据需要2个周期才能访问2个寄存器。在64位系统上,相同的数据只需花费1个周期即可访问1个寄存器。 一切都取决于您在做什么。我发现没有快速和严格的规则,因此您需要分析当前任务并选择最适合您特定任务需求的方法。     
根据我在Java中所做的一些研究和经验评估: 除了除法运算外,双精度和浮点型的基本算术运算在英特尔硬件上的性能基本相同。 另一方面,在iPhone 4和iPad上使用的Cortex-A8上,双打的“基本”算术运算时间大约是浮点数的两倍(浮点数上的寄存器FP加法运算大约需要4ns的时间) FP大约花了9ns的时间; 我已经对java.util.Math(三角函数等)上的方法进行了一些计时,原则上讲,原则上,其中一些在浮点数上可能会更快,因为计算精确度所需的术语更少浮点数另一方面,其中许多最终变得“不如您想像的那么糟糕”; 的确,在某些特殊情况下,例如内存带宽问题超过了“原始”计算时间。     
x86 FPU中的“本机”内部浮点表示形式为80位宽。这不同于“ 0”(32位)和“ 1”(64位)。每次将值移入或移出FPU都会执行一次转换。只有一个FPU指令执行正弦运算,并且对内部80位表示起作用。 对于
float
还是
double
,这种转换速度更快取决于许多因素,必须针对给定的应用进行测量。     
尽管在大多数系统上,单个值ѭ1的速度与ѭ0的速度相同,但您是正确的,单精度computing2ѭ,
sin
等计算功能应该比双精度计算要快得多。在C99中,即使变量为
double
,也可以使用
sqrtf
sinf
等函数,并获得收益。 我看到的另一个问题是内存(以及类似的存储设备)带宽。如果您要处理数百万或数十亿个值,则everything0 certainly几乎可以肯定是as1ѭ的两倍,因为所有内容都是受内存或IO约束的。在某些情况下,这是在数组或磁盘存储中使用“ 0”作为类型的一个很好的理由,但是我不认为在计算中使用“ 0”作为变量是一个很好的理由。     
这取决于处理器。如果处理器具有本机双精度指令,则执行双精度算术通常比给定浮点数更快,将其转换为双精度,执行双精度算术,然后将其转换回浮动。     

要回复问题请先登录注册