劍指offer 學習筆記 數值的整數次方

2021-10-02 23:35:15 字數 2445 閱讀 9231

由於精度原因,判斷兩個小數是否相等不能用==:

int

main()

以上**輸出0的原因是十進位制轉換為二進位制會損失精度,由於0.1轉換為二進位制結果為0.00011001100…無限迴圈,因此在double容量有限的情況下計算機只能近似存放,但0.5就可以轉換為二進位制0.1,就可以精確存放。當對無法精確存放的數字進行運算時,實際的運算物件並不是字面上的大小,如上例中0.1+0.2實際上並不是在計算0.1+0.2,而是兩個近似值在進行計算,因此結果自然就不等於0.3了。當兩個浮點數字面值一樣時,它們在記憶體中存放的近似值也一樣,此時可以用==號判斷是否相等,但計算後就不一定能了,但無論比較計算過的浮點數還是沒計算過的,用以下方式最穩妥。

判斷兩浮點數是否相等的一種常用做法是設乙個很小的數,當兩個小數之差小於這個很小的數時,認為這兩個小數相等:

double base =

0.1+

0.2;

double b =

0.3;

const

double eps =

1e-6

;// 誤差值,根據實際需求改變if(

abs(base - b)

< eps)

通常有3種方式把錯誤資訊傳遞給函式呼叫者:

1.用函式返回值告知呼叫者是否出錯。但使用不便,不能直接把計算結果通過返回值賦值給其他變數,也不能把這個函式計算的結果直接作為引數傳遞給其他函式。

2.錯誤發生時設定乙個全域性變數。但使用者可能忘記檢查全域性變數。

3.丟擲異常。

面試題16:數值的整數次方。實現函式double power(double base, int exponent),求base的exponent次方。不得使用庫函式,不需要考慮大數問題。

很多人一開始寫出的**:

#include

using

namespace std;

double

power

(double base,

int exponent)

return res;

}int

main()

但以上**沒有考慮到指數為0和負數的情況。當指數為負數時,我們可以先求出底數的指數絕對值次方,然後再取倒數,但如果底數為0時會出現對0取倒數,導致程式執行出錯,我們要選擇一種方式告訴呼叫者函式執行出錯。還有0的0次方在數學上是沒意義的,返回值為0或1都可以,但要和面試官說清楚,表示考慮到了該邊界值:

#include

using

namespace std;

bool g_invalidinput =

false

;double

powerwithunsignedexponent

(double base,

unsigned exponent)

return res;

// 0的0次方返回1

}double

power

(double base,

int exponent)

unsigned ab***ponent =

unsigned

(exponent);if

(exponent <0)

double res =

powerwithunsignedexponent

(base, ab***ponent);if

(exponent <0)

return res;

}int

main()

以上**當輸入0的負數次方時返回0,為了區分是輸入錯誤(0的負數次方)還是底數為0時的返回值,還設定了全域性變數來標識是否輸入出錯。但有個缺點就是呼叫者可能忘記檢查全域性變數的值。

還有更簡單高效的解法:以上解法中,指數是幾就要乘幾次。但我們求乙個數字的32次方時,只需要在16次方的基礎上平方一次就行,以此類推,求32次方只需乘5次,也就是以下公式:

據此可以把powerwithunsignedexponent函式做以下優化:

double

powerwithunsignedexponent

(double base,

unsigned exponent)

if(exponent ==1)

double res =

powerwithunsignedexponent

(base, exponent >>1)

; res *

= res;if(

(exponent &1)

==1)return res;

}

劍指offer 學習筆記 陣列

int getsize int data intmain cout sizeof data endl int p data cout sizeof p endl cout getsize data endl return0 以上 輸出為20 4 4,sizeof data 求的是陣列大小,p雖然和陣...

劍指offer學習筆記

筆記主要記錄方法和知識點 知識點1 負數與補碼 乙個參考 知識點2 移位操作 右移 變小 按位 操作 知識點3 0xffffffff表示32位 1 o logn 的方法 非遞迴的快速冪,用到二進位制表示。在迴圈內注意base base。兩個指標等間距一起走。想明白斷開鍊錶這個事情,相當於操作是在原有...

python學習筆記 數值

獲取圓周率不同的精度 import math for precision in range 10 print round math.pi,precision int,round,math.floor的不同之處 import math for n in 2,7,1.2,1.7,2,7,1.2 1.7 ...