将float转换为double

Ton*_*ony 9 c++ floating-point double

如何昂贵是一个转换floatdouble?这intlong转换来说是微不足道的吗?

编辑:我假设一个平台,其中float是4个字节,double是8个字节

Sum*_*uma 11

平台考虑因素

这取决于用于浮点计算的平台.使用x87 FPU,转换是免费的,因为寄存器内容是相同的 - 您有时可能支付的唯一价格是内存流量,但在许多情况下甚至没有流量,因为您可以简单地使用该值而无需任何转换.x87在这方面实际上是一个奇怪的野兽 - 很难正确区分它上面的浮点数和双精度数,因为使用的指令和寄存器是相同的,不同的是加载/存储指令和计算精度本身是使用状态位控制的.使用混合浮点/双精度计算可能会导致意外结果(并且有编译器命令行选项来控制精确行为和优化策略,因此).

当您使用SSE时(有时Visual Studio默认使用SSE),它可能会有所不同,因为您可能需要在FPU寄存器中传输值或执行明确的操作以执行转换.

内存节省性能

作为总结,并在其他地方回答您的评论:如果您想将浮动计算的结果存储到32b存储中,结果将是相同的速度或更快,因为:

  • 如果你在x87上执行此操作,则转换是免费的 - 唯一的区别是将使用fstp dword []而不是fstp qword [].
  • 如果在启用SSE的情况下执行此操作,您甚至可能会看到一些性能增益,因为一旦计算的精度仅为默认的double浮点数,则可以使用SSE完成一些浮点计算.
  • 在所有情况下,内存流量都较低


Ste*_*non 5

在某些平台上浮动到双重转换是免费的(PPC,x86,如果你的编译器/运行时使用"你告诉我使用什么类型的地狱,我将评估所有在long double中的所有东西,nyah nyah"评估模式).

在使用SSE寄存器在指定类型中实际进行浮点计算的x86环境中,float和double之间的转换与浮点加法或乘法一样昂贵(即,除非你是一个性能因素,否则不太可能是性能考虑因素)做了很多).

在缺乏硬件浮点的嵌入式环境中,它们可能有些昂贵.