【发布时间】:2012-03-11 04:48:26
【问题描述】:
我正在阅读How can I write a power function myself?,dan04 给出的答案引起了我的注意,主要是因为我不确定 fortran 给出的答案,但我接受并实现了这个:
#include <iostream>
using namespace std;
float pow(float base, float ex){
// power of 0
if (ex == 0){
return 1;
// negative exponenet
}else if( ex < 0){
return 1 / pow(base, -ex);
// even exponenet
}else if ((int)ex % 2 == 0){
float half_pow = pow(base, ex/2);
return half_pow * half_pow;
//integer exponenet
}else{
return base * pow(base, ex - 1);
}
}
int main(){
for (int ii = 0; ii< 10; ii++){\
cout << "pow(" << ii << ".5) = " << pow(ii, .5) << endl;
cout << "pow(" << ii << ",2) = " << pow(ii, 2) << endl;
cout << "pow(" << ii << ",3) = " << pow(ii, 3) << endl;
}
}
虽然我不确定我是否翻译正确,因为所有以 0.5 作为指数的调用都返回 0。在答案中它指出它可能需要基于 a^b = 2^(b * log2(a)) 的 log2(x),但我是不确定将其放入,因为我不确定将其放入何处,或者我什至在考虑是否正确。
注意:我知道这可能在数学库中定义,但我不需要为几个函数增加整个数学库的所有额外费用。
编辑:有人知道小数指数的浮点实现吗? (我见过双重实现,但那是使用寄存器技巧,我需要浮点,并且添加一个库只是为了做一个技巧我最好只包括数学库)
【问题讨论】:
-
或者增加一个 FPU 的费用?
-
您缺少小数指数(偶数指数的代码) - 查看原始链接,我认为您正在从仅支持整数指数的东西中复制(因此测试小数将失败)。
-
我向你保证,这比 math.h 的战俘要贵。
-
@BrettHale 它是 log2(n) 不是吗?所以对于 pow(base, 1000000) 它的深度约为 20。
-
@andrewcooke - 当然,如果 ((float) ex % 2 == 0) 确实有效。