pow 函式自實現

2021-07-11 13:50:37 字數 1439 閱讀 4351

題目:實現函式double power(double base, int exponent),求base的exponent次方。不得使用庫函式同時不需要考慮大數問題。

其實這道題就是要實現pow這個庫函式。你可不要自以為這道題目簡單,直接給出乙個for迴圈了事。像下面這樣:

double power(double base, int exponent)

return result;

}

初看起來貌似沒有問題,不過遺憾的是並沒有考慮到所有的輸入的情況。如果輸入的指數小於1那怎麼辦?這段**完全沒有考慮這些意外!

同時,這段**的效率高嗎?不高。我們是否還有更好的解法,答案是肯定的!假設求a的n次方,當n為偶數時,a的n次方可以由兩個a的n/2次方相乘求得;當n為奇數時,a的n次方可以由兩個a的n/2次方相乘的積再乘以a得到。

由此,我們可以寫出如下魯棒又高效的**:

int equal(double elem1, double elem2)

double power_unsigned_exp(double base, unsigned int exponent)

double power(double base, int exponent)

if (exponent < 0)

abs_exponent = (unsigned int)(-exponent);

result = power_unsigned_exp(base, abs_exponent >> 1);

result *= result;

if (result < 0)

result = 1.0 / result;

return result;

}

這段**中還有其它的優點。比如,要求exponent的一半是,使用了右移一位的操作,而不是簡單的除以2,提公升了效率;再比如,判斷exponent的奇偶性是也是使用了位操作;還有,浮點數與浮點數的比較不能直接用==比較,牽扯到精度的問題。

最後一點,用了乙個全域性變數來標識是否出錯。我們可以採用3種錯誤處理方法方法:返回值,全域性**和異常。這三種方法各有優缺點,需要自己權衡。下面簡單的列出幾種錯誤處理方式的優缺點:

返回值 優點:和系統api一致;缺點:不能方便地使用計算結果。

全域性變數 優點:能夠方便地使用計算結果;缺點:使用者可能會忘記檢查全域性變數。

異常優點:可以為不同的出錯原因定義不同異常型別,邏輯清晰明了;缺點:有些語言不支援異常,丟擲異常時對效能由負面影響。

STL中對Pow函式的實現

在 stl原始碼剖析 中看到了pow函式在stl中的實現,感覺程式寫的非常巧妙。列出原始碼 template inline t identity element plus template inline t identity element multiplies template inline t ...

strcpy 函式自實現

strcpy 這個函式應該是每個人經常用到的了,今天,我們就自己來實現一下這個函式 int main void 如上,先把整體的框架定好,接著開始寫my strcpy函式 char my strcpy char dest,const char src const使src不能做左值,防止while裡d...

strcmp 函式自實現

今天繼續來模擬實現庫函式 strcmp 寫my str cmp 函式之前,先了解一下它的定義 strcmp c c 函式,比較兩個字串 設這兩個字串為str1,str2,若str1 str2,則返回零 若str1 str2,則返回正數 若str1 str2 時返回乙個正數就好,具體這個數字是幾,是無...