的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