select POWER(2.,64.)
zwraca 18446744073709552000
zamiast 18446744073709551616
. Wygląda na to, że ma tylko 16 cyfr precyzji (zaokrąglenie 17).
Nawet precyzując precyzję select power(cast(2 as numeric(38,0)),cast(64 as numeric(38,0)))
, nadal zwraca zaokrąglony wynik.
Wydaje się, że jest to dość podstawowa operacja polegająca na tym, że łuszczy się z taką dokładnością przy 16 cyfrach. Najwyższe, jakie może poprawnie obliczyć, to tylko POWER(2.,56.)
nie POWER(2.,57.)
. Co tu się dzieje?
Naprawdę straszne jest to, że select 2.*2.*2.*2.*2.*2.*2.*2.*2.*2.*2.*2.*2.*2.*2.*2.*2.*2.*2.*2.*2.*2.*2.*2.*2.*2.*2.*2.*2.*2.*2.*2.*2.*2.*2.*2.*2.*2.*2.*2.*2.*2.*2.*2.*2.*2.*2.*2.*2.*2.*2.*2.*2.*2.*2.*2.*2.*2.*2.*2.*2.*2.*2.*2.;
faktycznie zwraca odpowiednią wartość. Tyle o zwięzłości.