我正在使用 C 編譯器,但用 C 撰寫代碼(如果有幫助)
有一串數字
(-1^(a-1)/2a-1)B^(2a-1)
A 和 X 是用戶定義的... A 必須是正數,但 X 可以是任何 ( ,-)...
解碼這個序列......我需要使用指數/冪,但受到了一些限制......我不能創建另一個函式,使用遞回,或者pow()(在cmath或math.h附帶的其他高級數學函式中)。
有很多類似的問題,但許多答案使用了與這個問題沒有直接關系的函式和遞回。
這是與 完美配合的代碼pow(),我花了很多時間嘗試修改它以替換pow()為我自己的代碼,但似乎沒有任何效果......主要是得到錯誤的結果。X 和 J 是用戶輸入的變數
for (int i = 1; i < j; i )
sum = (pow(-1, i - 1)) / (5 * i - 1) * (pow(x, 5 * i - 1));
}
uj5u.com熱心網友回復:
您可以使用宏來擺脫函式呼叫限制,因為宏會生成行內代碼,這在技術上不是函式呼叫
但是,在更復雜的操作的情況下,宏不能有回傳值,因此您需要對結果使用一些區域變數(在多個運算式的情況下),例如:
int ret;
#define my_pow_notemp(a,b) (b==0)?1:(b==1)?a:(b==2)?a*a:(b==3)?a*a*a:0
#define my_pow(a,b)\
{\
ret=1;\
if (int(b& 1)) ret*=a;\
if (int(b& 2)) ret*=a*a;\
if (int(b& 4)) ret*=a*a*a*a;\
if (int(b& 8)) ret*=a*a*a*a*a*a*a*a;\
if (int(b&16)) ret*=a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a;\
if (int(b&32)) ret*=a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a;\
}
void main()
{
int a=2,b=3,c;
c=my_pow_notemp(a,b); // c = a^b
my_pow(a,b); c = ret; // c = a^b
}
如您所見,您可以my_pow_notemp直接使用,但代碼是硬編碼的,因此只有a^3在您想要更多時才必須將其添加到代碼中。所述my_pow正在接受指數高達^ 63和它的也有關如何在更復雜的代碼內宏的情況下,回傳值的例子。這里有一些關于如何計算冪的(正常)方法,以防您需要非整數或負指數(但如果沒有回圈/遞回,將其轉換為展開的代碼將非常困難):
- 負指數平方的冪
如果您想擺脫遞回和函式呼叫,您可以使用模板而不是宏,但這僅限于 C 。
template<class T> T my_pow(T a,T b)
{
if (b==0) return 1;
if (b==1) return a;
return a*my_pow(a,b-1);
}
void main()
{
int a=2,b=3,c;
c=my_pow(a,b);
}
如您所見,模板具有回傳值,因此即使使用更復雜的代碼(不僅僅是單個運算式)也沒有問題。
為了避免回圈,您可以使用LUT表
int my_pow[4][4]=
{
{1,0,0,0}, // 0^
{1,1,1,1}, // 1^
{1,2,4,8}, // 2^
{1,3,9,27}, // 3^
};
void main()
{
int a=2,b=3,c;
c=my_pow[a][b];
}
如果您有權訪問 FPU 或高級數學匯編,則可以使用它,因為 asm 指令不是函式呼叫。FPU 通常具有log,exp,pow本機功能。然而,這將代碼限制為特定指令集!!!
這里有一些例子:
- 如何:x86 中的 pow(real, real)
因此,當我考慮到您的局限性時,我認為最好的方法是:
#define my_pow(a,b) (b==0)?1:(b==1)?a:(b==2)?a*a:(b==3)?a*a*a:0
void main()
{
int a=2,b=3,c;
c=my_pow(a,b); // c = a^b
}
這將適用于高達 3 的int指數b(如果你想要更多,只需添加(b==4)?a*a*a*a: ... :0)以及兩者int和float基數a。如果您需要更大的指數,請使用帶有本地臨時變數的復雜版本來回傳結果。
[Edit1] 最終的單運算式宏,通過平方達到 a^15
#define my_pow(a,b) (1* (int(b&1))?a:1* (int(b&2))?a*a:1* (int(b&4))?a*a*a*a:1* (int(b&8))?a*a*a*a*a*a*a*a:1)
void main()
{
int a=2,b=3,c;
c=my_pow(a,b); // c = a^b
}
如果您想要的a^15不僅僅是(int(b&16))?a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a:1為指數的每一位添加子項等。
uj5u.com熱心網友回復:
這是一個系列。pow()根據之前的迭代進行替換。@芭絲謝巴
代碼不需要呼叫pow(). 它可以形成pow(x, 5 * i - 1)和pow(-1, i - 1),因為兩者都有一個int基于迭代器的指數i,來自先前的回圈迭代。
例子:
讓f(x, i) = pow(x, 5 * i - 1)
那么f(x, 1) = x*x*x*x
和f(x, i > 1) = f(x, i-1) * x*x*x*x*x
double power_n1 = 1.0;
double power_x5 = x*x*x*x;
for (int i = 1; i < j 1; i )
// sum = (pow(-1, i - 1)) / (5 * i - 1) * (pow(x, 5 * i - 1));
sum = power_n1 / (5 * i - 1) * power_x5;
power_n1 = -power_n1;
power_x5 *= x*x*x*x*x;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/355897.html
