Я читал через How can I write a power function myself? и ответ дается dan04 привлекло мое внимание главным образом потому, что я не уверен, что ответ дается Fortran, но я взял, что и реализовано это:самодельных пау() C++
#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;
}
}
, хотя я не уверен, что я перевел это право, потому что все вызовы, дающие .5, как показатель экспоненты, возвращают 0. В ответе он утверждает, что ему может понадобиться log2 (x) на основе a^b = 2^(b * log2(a))
, но я не уверен, потому что я не уверен, где это сказать, или если я даже думаю об этом праве.
ПРИМЕЧАНИЕ: Я знаю, что это может быть определено в математической библиотеке, но мне не нужны все дополнительные затраты на всю математическую библиотеку для нескольких функций.
EDIT: кто-нибудь знает реализацию с плавающей запятой для дробных показателей? (Я видел двойную реализацию, но это использовало трюк с регистрами, и мне нужна плавающая точка, и добавление библиотеки просто для того, чтобы сделать трюк, мне было бы лучше, включая математическую библиотеку)
Или дополнительные расходы из ФПУ? –
вам не хватает дробного показателя (код для четного показателя) - глядя на исходную ссылку, я думаю, что вы копируете что-то, что поддерживает только числовые экспоненты (поэтому тесты для дробного не будут выполняться). –
@ andrewcooke dang it. не могли бы вы помочь мне, указав необходимые изменения. – gardian06