由於精度原因,判斷兩個小數是否相等不能用==:
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 ...