C# float比double慢吗?64位程序比32位程序运行得快吗?

C# float比double慢吗?64位程序比32位程序运行得快吗?,c#,java,c++,c,static-typing,C#,Java,C++,C,Static Typing,使用float类型是否比使用double类型慢 我听说现代Intel和AMD CPU的计算速度比浮点数快一倍 那么标准的数学函数(sqrt,pow,log,sin,cos等)呢?以单精度计算它们应该要快得多,因为它需要更少的浮点运算。例如,单精度sqrt可以使用比双精度sqrt更简单的数学公式。另外,我听说标准数学函数在64位模式下(在64位操作系统上编译和运行时)速度更快。对此的最终答案是什么?这取决于处理器。如果处理器有本机双精度指令,通常只执行双精度运算要比给定浮点、将其转换为双精度、执行

使用
float
类型是否比使用
double
类型慢

我听说现代Intel和AMD CPU的计算速度比浮点数快一倍


那么标准的数学函数(
sqrt
pow
log
sin
cos
等)呢?以单精度计算它们应该要快得多,因为它需要更少的浮点运算。例如,单精度
sqrt
可以使用比双精度
sqrt
更简单的数学公式。另外,我听说标准数学函数在64位模式下(在64位操作系统上编译和运行时)速度更快。对此的最终答案是什么?

这取决于处理器。如果处理器有本机双精度指令,通常只执行双精度运算要比给定浮点、将其转换为双精度、执行双精度运算,然后将其转换回浮点更快。

您的第一个问题已经得到回答

第二个问题完全取决于您处理的数据的“大小”。这一切归结为系统的底层架构以及如何处理大值。32位系统中的64位数据需要2个周期才能访问2个寄存器。64位系统上的相同数据访问1个寄存器只需1个周期

一切都取决于你在做什么。我发现没有快速和严格的规则,因此您需要分析当前任务,并选择最适合该特定任务需要的方法。

x86 FPU中的“本机”内部浮点表示是80位宽。这与
浮点(32位)和
双精度(64位)都不同。每次值移入或移出FPU时,都会执行转换。只有一条FPU指令执行sin操作,它在内部80位表示上工作


float
double
的转换速度更快取决于许多因素,必须针对给定的应用进行测量。

虽然在大多数系统上,对于单个值,double
的转换速度与
float
的转换速度相同,但是像
sqrt
这样的计算功能是正确的,单精度下的sin
等应该比双精度下的计算快得多。在C99中,您可以使用
sqrtf
sinf
等函数,即使您的变量是
double
,也可以从中获益


我提到的另一个问题是内存(同样也是存储设备)带宽。如果要处理数百万或数十亿个值,
float
的速度几乎肯定是
double
的两倍,因为所有内容都是内存限制或io限制的。在某些情况下,这是一个很好的理由使用<代码>浮点< /代码>作为数组或磁盘存储中的类型,但是我不认为使用<代码>浮点< /代码>对于您计算的变量是一个很好的理由。

< P>经典的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
版本更有效地实现。

根据我在Java中进行的一些研究和经验测量:

  • 除除法外,双精度和浮点的基本算术运算在英特尔硬件上的执行基本相同
  • 另一方面,在iPhone 4和iPad中使用的Cortex-A8上,即使是双精度上的“基本”算法也需要大约两倍于浮点数的时间(浮点数上的寄存器FP加法需要大约4ns,而双精度上的寄存器FP需要大约9ns)
  • 我做了一些三角图