gpt4 book ai didi

c++ - 如何强制 pow(float, int) 返回 float

转载 作者:可可西里 更新时间:2023-11-01 16:11:05 25 4
gpt4 key购买 nike

重载函数 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。现在我需要最有效的方法来实现这一点(更少的转换、使用已经优化的算法等)。

最佳答案

您可以使用 exponentiation by squaring 轻松编写自己的 fpow .

float my_fpow(float base, unsigned exp)
{
float result = 1.f;
while (exp)
{
if (exp & 1)
result *= base;
exp >>= 1;
base *= base;
}

return result;
}


无聊的部分:

这个算法给出了最好的精度,当|base|时,可以用float类型存档> 1

证明:

让我们计算pow(a, n),其中a是基数,n是指数。
让我们定义b1=a1b2=a2, b3=a4, b4=a 8,等等。

那么 an 是所有此类 bi 的乘积,其中 ith 位在 n 中设置。

所以我们有令集合B={bk1,bk1,...,bkn} 并且对于任何 j 位 kj 设置在 n 中。

以下明显的算法A可用于舍入误差最小化:

  • 如果B包含单个元素,则为结果
  • B中以最小模取两个元素pq
  • 将它们从 B 中移除
  • 计算乘积s = p*q并放入B
  • 转到第一步

现在,让我们证明 B 中的元素可以从左到右相乘而不会失去准确性。这是事实,即:

bj> b1*b2*...*bj-1

因为bj=bj-1*bj-1=bj-1*bj-2*bj-2=...=bj-1*bj-2 *...*b1*b1

因为 b1 = a1 = a 并且它的模大于 1 那么:

bj> b1*b2*...*bj-1

因此我们可以得出结论,在从左到右的乘法过程中,累加器变量小于 B 中的任何元素。

然后,表达式 result *= base;(当然除了第一次迭代)对 B 中的两个最小数进行乘法运算,因此舍入误差最小.因此,代码采用算法 A

关于c++ - 如何强制 pow(float, int) 返回 float,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48280854/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com