的Oracle documentation somewhat covers this:
數值函數
數字函數接受數字輸入和返回的數值。大多數 數字函數返回的NUMBER值精確到38位十進制 數字。的超越函數COS
,COSH
,EXP
,LN
, LOG
,SIN
,SINH
,SQRT
,TAN
,和TANH
精確到36張 十進制數。超越函數ACOS
,ASIN
,ATAN
, 和ATAN2
精確到30位十進制數。
所以SQRT
據說是精確到36位十進制數;但POWER
不在列表中,因此暗示它精確到38個十進制數字。如果您查看兩個函數返回的值,則可以看到差異最小的數字;例如爲X = 2
:
SQRT(2): 1.41421356237309504880168872420969807857
POWER(2, 1/2): 1.41421356237309504880168872420969807855
然而奇怪的是,它看起來像SQRT
更準確,這是POWER
是稍微不太精確,如你所說。Wolfram Alpha gives:
1.4142135623730950488016887242096980785696718753769480...
(但是請注意,還稱這是一個近似值),這輪以相同的SQRT
;如果你有SQRT(2) * SQRT(2)
逆轉這一過程,並POWER((POWER(2, 1/2), 2)
你:
(SQRT): 2
(POWER): 1.99999999999999999999999999999999999994
當X
是binary_double
而非number
你會得到兩個相同的值:
1.4142135623730951
,但你已經失去了精度;再次平方給出:
2.0000000000000004
最終浮點數的任何十進制表示具有限制其精度,並且將近似。兩個函數給出略微不同的近似值可能有點令人困惑,但由於它們似乎更接近於近似值(儘管文檔中提到了這一點) - 作爲一種特殊情況 - 我不確定這是否真的有什麼值得抱怨的地方。
問題是什麼?這只是觀察。 – San
現在無法訪問sqlplus。嘗試用'X ** 0.5'替換'POWER(X,1/2)'。 – ibre5041
您正試圖比較實數。你需要截斷到你想要的精度。 – Glenn