【发布时间】:2018-01-16 12:04:21
【问题描述】:
重载函数 float pow(float base, int iexp ) 在 C++11 中被删除,现在 pow 返回一个 double。在我的程序中,我正在计算很多这些(单精度),并且我对最有效的方法很感兴趣。
是否有带有上述签名的特殊函数(在标准库或任何其他函数中)?
如果不是,最好(就单精度性能而言)在任何其他操作之前将pow 的结果显式转换为float(这会将其他所有内容转换为double)或转换iexp进入float 并使用重载函数float pow(float base, float exp)?
编辑:为什么我需要float而不使用double?
主要原因是 RAM —— 我需要数十或数百 GB,因此这种减少是巨大的优势。所以我需要从float 得到float。现在我需要最有效的方法来实现这一点(更少的演员,使用已经优化的算法等)。
【问题讨论】:
-
您是否将此视为性能问题?根据目标,您可能会发现
double版本更快 -
@Caninonos 实际上,根据cpp reference,所有这些整数函数都已被删除......(重载7的评论:“如果任何参数具有整数类型,则它被强制转换加倍 [...]")
-
This answer 可能很有趣...考虑到这一点,我倾向于推荐 float+float 重载,但如果不对这两种变体进行基准测试,就不可能得到明确的答案(结果是很可能是特定于编译器的...)。
-
@Non-maskable Interrupt 关于 Caleth 的评论,我曾经有一个实际案例,
double比float快得多。我们预计它会比使用双精度更快,因为 SSE 指令可以在一条指令中处理更多数据,而且我们的数据是 24 位浮点数。检查汇编代码后,问题是结果总是用特殊指令四舍五入到浮点精度,这些消耗了大量时间,而双精度运算没有使用任何舍入。有编译器选项可以改变这一点。 -
@LưuVĩnhPhúc 如果 OP 正在执行
pow()的数百 GB 管道,最好的解决方案似乎是将其移至 GPU 计算着色器。