c++ - 将 float 转换为 double

标签 c++ floating-point double

float 转换为 double 的代价是多少?它是否像 intlong 的转换一样微不足道?

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

最佳答案

平台注意事项

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

当您使用 SSE 时(有时 Visual Studio 默认使用 SSE),它可能会有所不同,因为您可能需要传输 FPU 寄存器中的值或做一些明确的事情来执行转换。

内存节省性能

作为总结,并在别处回答你的评论:如果你想将 float 计算的结果存储到 32b 存储中,结果将是相同的速度或更快,因为:

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

关于c++ - 将 float 转换为 double ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1421684/

相关文章:

c++ - Cuda Thrust内存管理

floating-point - 了解浮点表示错误;我的想法有什么问题?

c++ - 如何在 C++ 中将字符串转换为具有 6 位精度的 double ?

c++ - AIX 编译器 13.1.3 对 c++ 的双重转换不正确

java - 显然,如果已经存在很多 AssetFileDescriptors,则在 native 端的 Android 上创建文件会失败

c++ - 运行时多态性到底是什么意思?

c++ - Bazel Link .so 库位于一个完全不同的、非常远程的文件夹中

python - 1**math.nan 和 0j**math.nan 的惊喜

c++ - 即使数字在小数点后 4 位以内,也会在 EXPECT_FLOAT_EQ 上触发 googletest 错误

c# - 如何按 double 值对 List<T> 进行排序?