[Moving this to -hackers]
> On 13/10/2022 18:20 CEST Adrian Klaver <[email protected]> wrote:
> > select power(10, -18::numeric);
> > power
> > --------------------
> > 0.0000000000000000
> >
On Thu, 13 Oct 2022 at 18:17, Tom Lane <[email protected]> wrote:
>
> An inexact result isn't surprising, but it shouldn't be *that* inexact.
>
> I'm inclined to think that we should push the responsibility for choosing
> its rscale into power_var_int(), because internally that already does
> estimate the result weight, so with a little code re-ordering we won't
> need duplicative estimates. Don't have time to work on that right now
> though ... Dean, are you interested in fixing this?
>
Here's a patch along those lines, bringing power_var_int() more in
line with neighbouring functions by having it choose its own result
scale.
It was necessary to also move the overflow/underflow tests up, in
order to avoid a potential integer overflow when deciding the rscale.
Looking more closely at the upper limit of the overflow test, it turns
out it was far too large. I'm not sure where the "3 * SHRT_MAX" came
from, but I suspect it was just a thinko on my part, back in
7d9a4737c2. I've replaced that with SHRT_MAX + 1, which kicks in much
sooner without changing the actual maximum result allowed, which is <
10^131072 (the absolute upper limit of the numeric type).
The first half the the underflow test condition "f + 1 < -rscale" goes
away, since this is now being done before rscale is computed, and the
choice of rscale makes that condition false. In fact, the new choice
of rscale now ensures that when sig_digits is computed further down,
it is guaranteed to be strictly greater than 0, rather than merely
being >= 0 as before, which is good.
As expected, various regression test results change, since the number
of significant digits computed is now different, but I think the new
results look a lot better, and more consistent. I regenerated the
numeric_big test results by re-running the bc script and rounding to
the new output precisions, and the results from power_var_int()
exactly match in every case. This already included a number of cases
that used to round to zero, and now produce much more reasonable
results.
The test cases where the result actually does round to zero now output
1000 zeros after the decimal point. That looks a little messy, but I
think it's the right thing to do in fixed-point arithmetic -- it's
consistent with the fractional power case, and with exp(numeric),
reflecting the fact that the result is zero to 1000 decimal places,
whilst not being exactly zero.
Overall, I'm quite happy with these results. The question is, should
this be back-patched?
In the past, I think I've only back-patched numeric bug-fixes where
the digits output by the old code were incorrect or an error was
thrown, not changes that resulted in a different number of digits
being output, changing the precision of already-correct results.
However, having 10.0^(-18) produce zero seems pretty bad, so my
inclination is to back-patch, unless anyone objects.
Regards,
Dean
diff --git a/src/backend/utils/adt/numeric.c b/src/backend/utils/adt/numeric.c
new file mode 100644
index cafe1ac..af0d94b
--- a/src/backend/utils/adt/numeric.c
+++ b/src/backend/utils/adt/numeric.c
@@ -571,8 +571,7 @@ static void log_var(const NumericVar *ba
NumericVar *result);
static void power_var(const NumericVar *base, const NumericVar *exp,
NumericVar *result);
-static void power_var_int(const NumericVar *base, int exp, NumericVar *result,
- int rscale);
+static void power_var_int(const NumericVar *base, int exp, NumericVar *result);
static void power_ten_int(int exp, NumericVar *result);
static int cmp_abs(const NumericVar *var1, const NumericVar *var2);
@@ -10335,13 +10334,8 @@ power_var(const NumericVar *base, const
{
if (expval64 >= PG_INT32_MIN && expval64 <= PG_INT32_MAX)
{
- /* Okay, select rscale */
- rscale = NUMERIC_MIN_SIG_DIGITS;
- rscale = Max(rscale, base->dscale);
- rscale = Max(rscale, NUMERIC_MIN_DISPLAY_SCALE);
- rscale = Min(rscale, NUMERIC_MAX_DISPLAY_SCALE);
-
- power_var_int(base, (int) expval64, result, rscale);
+ /* Okay, use power_var_int */
+ power_var_int(base, (int) expval64, result);
return;
}
}
@@ -10475,19 +10469,74 @@ power_var(const NumericVar *base, const
* power_var_int() -
*
* Raise base to the power of exp, where exp is an integer.
+ *
+ * Note: this routine chooses dscale of the result.
*/
static void
-power_var_int(const NumericVar *base, int exp, NumericVar *result, int rscale)
+power_var_int(const NumericVar *base, int exp, NumericVar *result)
{
double f;
int p;
int i;
+ int rscale;
int sig_digits;
unsigned int mask;
bool neg;
NumericVar base_prod;
int local_rscale;
+ /*
+ * Choose the result scale. For this we need an estimate of the decimal
+ * weight of the result, which we obtain by approximating using double
+ * precision arithmetic.
+ *
+ * We also perform crude overflow/underflow tests here so that we can exit
+ * early if the result is sure to overflow/underflow, and to guard against
+ * integer overflow when choosing the result scale.
+ */
+ if (base->ndigits != 0)
+ {
+ /*----------
+ * Choose f (double) and p (int) such that base ~= f * 10^p.
+ * Then log10(result) = log10(base^exp) ~= exp * (log10(f) + p).
+ *----------
+ */
+ f = base->digits[0];
+ p = base->weight * DEC_DIGITS;
+
+ for (i = 1; i < base->ndigits && i * DEC_DIGITS < 16; i++)
+ {
+ f = f * NBASE + base->digits[i];
+ p -= DEC_DIGITS;
+ }
+
+ f = exp * (log10(f) + p); /* approximate decimal result weight */
+ }
+ else
+ f = 0; /* result is 0 or 1 (weight 0), or error */
+
+ /* overflow/underflow tests with fuzz factors */
+ if (f > (SHRT_MAX + 1) * DEC_DIGITS)
+ ereport(ERROR,
+ (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
+ errmsg("value overflows numeric format")));
+ if (f + 1 < -NUMERIC_MAX_DISPLAY_SCALE)
+ {
+ zero_var(result);
+ result->dscale = NUMERIC_MAX_DISPLAY_SCALE;
+ return;
+ }
+
+ /*
+ * Choose the result scale in the same way as power_var(), so it has at
+ * least NUMERIC_MIN_SIG_DIGITS significant digits and is not less than
+ * dscale of base.
+ */
+ rscale = NUMERIC_MIN_SIG_DIGITS - (int) f;
+ rscale = Max(rscale, base->dscale);
+ rscale = Max(rscale, NUMERIC_MIN_DISPLAY_SCALE);
+ rscale = Min(rscale, NUMERIC_MAX_DISPLAY_SCALE);
+
/* Handle some common special cases, as well as corner cases */
switch (exp)
{
@@ -10532,43 +10581,15 @@ power_var_int(const NumericVar *base, in
* The general case repeatedly multiplies base according to the bit
* pattern of exp.
*
- * First we need to estimate the weight of the result so that we know how
- * many significant digits are needed.
- */
- f = base->digits[0];
- p = base->weight * DEC_DIGITS;
-
- for (i = 1; i < base->ndigits && i * DEC_DIGITS < 16; i++)
- {
- f = f * NBASE + base->digits[i];
- p -= DEC_DIGITS;
- }
-
- /*----------
- * We have base ~= f * 10^p
- * so log10(result) = log10(base^exp) ~= exp * (log10(f) + p)
- *----------
- */
- f = exp * (log10(f) + p);
-
- /*
- * Apply crude overflow/underflow tests so we can exit early if the result
- * certainly will overflow/underflow.
+ * The local rscale used for each multiplication is varied to keep a fixed
+ * number of significant digits, sufficient to give the required result
+ * scale.
*/
- if (f > 3 * SHRT_MAX * DEC_DIGITS)
- ereport(ERROR,
- (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
- errmsg("value overflows numeric format")));
- if (f + 1 < -rscale || f + 1 < -NUMERIC_MAX_DISPLAY_SCALE)
- {
- zero_var(result);
- result->dscale = rscale;
- return;
- }
/*
* Approximate number of significant digits in the result. Note that the
- * underflow test above means that this is necessarily >= 0.
+ * underflow test above, together with the choice of rscale, ensures that
+ * this is necessarily > 0.
*/
sig_digits = 1 + rscale + (int) f;
diff --git a/src/test/regress/expected/numeric.out b/src/test/regress/expected/numeric.out
new file mode 100644
index e224eff..dc3238f
--- a/src/test/regress/expected/numeric.out
+++ b/src/test/regress/expected/numeric.out
@@ -952,44 +952,44 @@ WITH v(x) AS
SELECT x1, x2,
power(x1, x2)
FROM v AS v1(x1), v AS v2(x2) WHERE x1 != 0 OR x2 >= 0;
- x1 | x2 | power
-----------+----------+---------------------
- 0 | 0 | 1.0000000000000000
- 0 | 1 | 0.0000000000000000
- 0 | 2 | 0.0000000000000000
- 0 | 4.2 | 0.0000000000000000
- 0 | Infinity | 0
- 0 | NaN | NaN
- 1 | 0 | 1.0000000000000000
- 1 | 1 | 1.0000000000000000
- 1 | 2 | 1.0000000000000000
- 1 | 4.2 | 1.0000000000000000
- 1 | Infinity | 1
- 1 | NaN | 1
- 2 | 0 | 1.0000000000000000
- 2 | 1 | 2.0000000000000000
- 2 | 2 | 4.0000000000000000
- 2 | 4.2 | 18.379173679952560
- 2 | Infinity | Infinity
- 2 | NaN | NaN
- 4.2 | 0 | 1.0000000000000000
- 4.2 | 1 | 4.2000000000000000
- 4.2 | 2 | 17.6400000000000000
- 4.2 | 4.2 | 414.61691860129675
- 4.2 | Infinity | Infinity
- 4.2 | NaN | NaN
- Infinity | 0 | 1
- Infinity | 1 | Infinity
- Infinity | 2 | Infinity
- Infinity | 4.2 | Infinity
- Infinity | Infinity | Infinity
- Infinity | NaN | NaN
- NaN | 0 | 1
- NaN | 1 | NaN
- NaN | 2 | NaN
- NaN | 4.2 | NaN
- NaN | Infinity | NaN
- NaN | NaN | NaN
+ x1 | x2 | power
+----------+----------+--------------------
+ 0 | 0 | 1.0000000000000000
+ 0 | 1 | 0.0000000000000000
+ 0 | 2 | 0.0000000000000000
+ 0 | 4.2 | 0.0000000000000000
+ 0 | Infinity | 0
+ 0 | NaN | NaN
+ 1 | 0 | 1.0000000000000000
+ 1 | 1 | 1.0000000000000000
+ 1 | 2 | 1.0000000000000000
+ 1 | 4.2 | 1.0000000000000000
+ 1 | Infinity | 1
+ 1 | NaN | 1
+ 2 | 0 | 1.0000000000000000
+ 2 | 1 | 2.0000000000000000
+ 2 | 2 | 4.0000000000000000
+ 2 | 4.2 | 18.379173679952560
+ 2 | Infinity | Infinity
+ 2 | NaN | NaN
+ 4.2 | 0 | 1.0000000000000000
+ 4.2 | 1 | 4.2000000000000000
+ 4.2 | 2 | 17.640000000000000
+ 4.2 | 4.2 | 414.61691860129675
+ 4.2 | Infinity | Infinity
+ 4.2 | NaN | NaN
+ Infinity | 0 | 1
+ Infinity | 1 | Infinity
+ Infinity | 2 | Infinity
+ Infinity | 4.2 | Infinity
+ Infinity | Infinity | Infinity
+ Infinity | NaN | NaN
+ NaN | 0 | 1
+ NaN | 1 | NaN
+ NaN | 2 | NaN
+ NaN | 4.2 | NaN
+ NaN | Infinity | NaN
+ NaN | NaN | NaN
(36 rows)
SELECT power('0'::numeric, '-1');
@@ -2431,15 +2431,15 @@ select sqrt(8015491789940783531003294973
-- Test code path for raising to integer powers
--
select 10.0 ^ -2147483648 as rounds_to_zero;
- rounds_to_zero
---------------------
- 0.0000000000000000
+ rounds_to_zero
+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+ 0.0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
(1 row)
select 10.0 ^ -2147483647 as rounds_to_zero;
- rounds_to_zero
---------------------
- 0.0000000000000000
+ rounds_to_zero
+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+ 0.0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
(1 row)
select 10.0 ^ 2147483647 as overflows;
@@ -2448,27 +2448,27 @@ select 117743296169.0 ^ 1000000000 as ov
ERROR: value overflows numeric format
-- cases that used to return inaccurate results
select 3.789 ^ 21;
- ?column?
---------------------------------
- 1409343026052.8716016316022141
+ ?column?
+--------------------
+ 1409343026052.8716
(1 row)
select 3.789 ^ 35;
- ?column?
-----------------------------------------
- 177158169650516670809.3820586142670135
+ ?column?
+---------------------------
+ 177158169650516670809.382
(1 row)
select 1.2 ^ 345;
- ?column?
------------------------------------------------
- 2077446682327378559843444695.5827049735727869
+ ?column?
+--------------------------------
+ 2077446682327378559843444695.6
(1 row)
select 0.12 ^ (-20);
- ?column?
---------------------------------------
- 2608405330458882702.5529619561355838
+ ?column?
+------------------------
+ 2608405330458882702.55
(1 row)
select 1.000000000123 ^ (-2147483648);
@@ -2491,15 +2491,15 @@ select round(((1 - 1.500012345678e-1000)
-- cases that used to error out
select 0.12 ^ (-25);
- ?column?
--------------------------------------------
- 104825960103961013959336.4983657883169110
+ ?column?
+-----------------------------
+ 104825960103961013959336.50
(1 row)
select 0.5678 ^ (-85);
- ?column?
-----------------------------------------
- 782333637740774446257.7719390061997396
+ ?column?
+----------------------------
+ 782333637740774446257.7719
(1 row)
select coalesce(nullif(0.9999999999 ^ 70000000000000, 0), 0) as underflows;
@@ -2539,6 +2539,54 @@ select (-1.0) ^ 1000000000000001;
-1.0000000000000000
(1 row)
+-- integer powers of 10
+select n, 10.0 ^ n as "10^n", (10.0 ^ n) * (10.0 ^ (-n)) = 1 as ok
+from generate_series(-20, 20) n;
+ n | 10^n | ok
+-----+----------------------------------------+----
+ -20 | 0.000000000000000000010000000000000000 | t
+ -19 | 0.00000000000000000010000000000000000 | t
+ -18 | 0.0000000000000000010000000000000000 | t
+ -17 | 0.000000000000000010000000000000000 | t
+ -16 | 0.00000000000000010000000000000000 | t
+ -15 | 0.0000000000000010000000000000000 | t
+ -14 | 0.000000000000010000000000000000 | t
+ -13 | 0.00000000000010000000000000000 | t
+ -12 | 0.0000000000010000000000000000 | t
+ -11 | 0.000000000010000000000000000 | t
+ -10 | 0.00000000010000000000000000 | t
+ -9 | 0.0000000010000000000000000 | t
+ -8 | 0.000000010000000000000000 | t
+ -7 | 0.00000010000000000000000 | t
+ -6 | 0.0000010000000000000000 | t
+ -5 | 0.000010000000000000000 | t
+ -4 | 0.00010000000000000000 | t
+ -3 | 0.0010000000000000000 | t
+ -2 | 0.010000000000000000 | t
+ -1 | 0.10000000000000000 | t
+ 0 | 1.0000000000000000 | t
+ 1 | 10.000000000000000 | t
+ 2 | 100.00000000000000 | t
+ 3 | 1000.0000000000000 | t
+ 4 | 10000.000000000000 | t
+ 5 | 100000.00000000000 | t
+ 6 | 1000000.0000000000 | t
+ 7 | 10000000.000000000 | t
+ 8 | 100000000.00000000 | t
+ 9 | 1000000000.0000000 | t
+ 10 | 10000000000.000000 | t
+ 11 | 100000000000.00000 | t
+ 12 | 1000000000000.0000 | t
+ 13 | 10000000000000.000 | t
+ 14 | 100000000000000.00 | t
+ 15 | 1000000000000000.0 | t
+ 16 | 10000000000000000.0 | t
+ 17 | 100000000000000000.0 | t
+ 18 | 1000000000000000000.0 | t
+ 19 | 10000000000000000000.0 | t
+ 20 | 100000000000000000000.0 | t
+(41 rows)
+
--
-- Tests for raising to non-integer powers
--
@@ -2630,9 +2678,9 @@ select 12.3 ^ (-45.6);
-- big test
select 1.234 ^ 5678;
- ?column?
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
- 307239295662090741644584872593956173493568238595074141254349565406661439636598896798876823220904084953233015553994854875890890858118656468658643918169805277399402542281777901029346337707622181574346585989613344285010764501017625366742865066948856161360224801370482171458030533346309750557140549621313515752078638620714732831815297168231790779296290266207315344008883935010274044001522606235576584215999260117523114297033944018699691024106823438431754073086813382242140602291215149759520833200152654884259619588924545324.5973362312547382
+ ?column?
+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+ 307239295662090741644584872593956173493568238595074141254349565406661439636598896798876823220904084953233015553994854875890890858118656468658643918169805277399402542281777901029346337707622181574346585989613344285010764501017625366742865066948856161360224801370482171458030533346309750557140549621313515752078638620714732831815297168231790779296290266207315344008883935010274044001522606235576584215999260117523114297033944018699691024106823438431754073086813382242140602291215149759520833200152654884259619588924545324.597
(1 row)
--
diff --git a/src/test/regress/expected/numeric_big.out b/src/test/regress/expected/numeric_big.out
new file mode 100644
index 468c602..12ff35b
--- a/src/test/regress/expected/numeric_big.out
+++ b/src/test/regress/expected/numeric_big.out
@@ -686,91 +686,91 @@ SELECT t1.id1, t1.result, t2.expected
-- echo "($b, $p, $r),"
-- done
WITH t(b, p, bc_result) AS (VALUES
-(0.084738, -20, 2744326694304960114888.7859130502035257),
-(0.084738, -19, 232548755422013710215.4459407000481464),
-(0.084738, -18, 19705716436950597776.2364581230406798),
-(0.084738, -17, 1669822999434319754.3627249884302211),
-(0.084738, -16, 141497461326065387.3451885900696001),
-(0.084738, -15, 11990211877848128.7928565907453178),
-(0.084738, -14, 1016026574105094.7376490817865767),
-(0.084738, -13, 86096059836517.5178789078924309),
-(0.084738, -12, 7295607918426.8214300228969888),
-(0.084738, -11, 618215223791.6519943372802450),
-(0.084738, -10, 52386321633.6570066961524534),
-(0.084738, -9, 4439112122.5928274334185666),
-(0.084738, -8, 376161483.0442710110530225),
-(0.084738, -7, 31875171.7502054369346110),
-(0.084738, -6, 2701038.3037689083149651),
-(0.084738, -5, 228880.5837847697527935),
-(0.084738, -4, 19394.8829087538193122),
-(0.084738, -3, 1643.4835879219811409),
-(0.084738, -2, 139.2655122733328379),
-(0.084738, -1, 11.8010809790176780),
+(0.084738, -20, 2744326694304960114888.785913),
+(0.084738, -19, 232548755422013710215.445941),
+(0.084738, -18, 19705716436950597776.236458),
+(0.084738, -17, 1669822999434319754.362725),
+(0.084738, -16, 141497461326065387.345189),
+(0.084738, -15, 11990211877848128.792857),
+(0.084738, -14, 1016026574105094.737649),
+(0.084738, -13, 86096059836517.517879),
+(0.084738, -12, 7295607918426.821430),
+(0.084738, -11, 618215223791.651994),
+(0.084738, -10, 52386321633.657007),
+(0.084738, -9, 4439112122.5928274),
+(0.084738, -8, 376161483.04427101),
+(0.084738, -7, 31875171.750205437),
+(0.084738, -6, 2701038.3037689083),
+(0.084738, -5, 228880.58378476975),
+(0.084738, -4, 19394.882908753819),
+(0.084738, -3, 1643.4835879219811),
+(0.084738, -2, 139.26551227333284),
+(0.084738, -1, 11.801080979017678),
(0.084738, 0, 1),
(0.084738, 1, .084738),
(0.084738, 2, .007180528644),
-(0.084738, 3, .0006084636362353),
-(0.084738, 4, .0000515599916073),
-(0.084738, 5, .0000043690905688),
-(0.084738, 6, .0000003702279966),
-(0.084738, 7, .0000000313723800),
-(0.084738, 8, .0000000026584327),
-(0.084738, 9, .0000000002252703),
-(0.084738, 10, .0000000000190890),
-(0.084738, 11, .0000000000016176),
-(0.084738, 12, .0000000000001371),
-(0.084738, 13, .0000000000000116),
-(0.084738, 14, .0000000000000010),
-(0.084738, 15, .0000000000000001),
-(0.084738, 16, .0000000000000000),
-(0.084738, 17, .0000000000000000),
-(0.084738, 18, .0000000000000000),
-(0.084738, 19, .0000000000000000),
-(0.084738, 20, .0000000000000000))
+(0.084738, 3, .000608463636235272),
+(0.084738, 4, .00005155999160730448),
+(0.084738, 5, .000004369090568819767),
+(0.084738, 6, .0000003702279966206494),
+(0.084738, 7, .00000003137237997764059),
+(0.084738, 8, .000000002658432734545308),
+(0.084738, 9, .0000000002252702730599003),
+(0.084738, 10, .00000000001908895239854983),
+(0.084738, 11, .000000000001617559648348316),
+(0.084738, 12, .0000000000001370687694817396),
+(0.084738, 13, .00000000000001161493338834365),
+(0.084738, 14, .0000000000000009842262254614642),
+(0.084738, 15, .00000000000000008340136189315355),
+(0.084738, 16, .000000000000000007067264604102046),
+(0.084738, 17, .0000000000000000005988658680223991),
+(0.084738, 18, .00000000000000000005074669592448206),
+(0.084738, 19, .000000000000000000004300173519248761),
+(0.084738, 20, .0000000000000000000003643881036741015))
SELECT b, p, bc_result, b^p AS power, b^p - bc_result AS diff FROM t;
- b | p | bc_result | power | diff
-----------+-----+-----------------------------------------+-----------------------------------------+--------------------
- 0.084738 | -20 | 2744326694304960114888.7859130502035257 | 2744326694304960114888.7859130502035257 | 0.0000000000000000
- 0.084738 | -19 | 232548755422013710215.4459407000481464 | 232548755422013710215.4459407000481464 | 0.0000000000000000
- 0.084738 | -18 | 19705716436950597776.2364581230406798 | 19705716436950597776.2364581230406798 | 0.0000000000000000
- 0.084738 | -17 | 1669822999434319754.3627249884302211 | 1669822999434319754.3627249884302211 | 0.0000000000000000
- 0.084738 | -16 | 141497461326065387.3451885900696001 | 141497461326065387.3451885900696001 | 0.0000000000000000
- 0.084738 | -15 | 11990211877848128.7928565907453178 | 11990211877848128.7928565907453178 | 0.0000000000000000
- 0.084738 | -14 | 1016026574105094.7376490817865767 | 1016026574105094.7376490817865767 | 0.0000000000000000
- 0.084738 | -13 | 86096059836517.5178789078924309 | 86096059836517.5178789078924309 | 0.0000000000000000
- 0.084738 | -12 | 7295607918426.8214300228969888 | 7295607918426.8214300228969888 | 0.0000000000000000
- 0.084738 | -11 | 618215223791.6519943372802450 | 618215223791.6519943372802450 | 0.0000000000000000
- 0.084738 | -10 | 52386321633.6570066961524534 | 52386321633.6570066961524534 | 0.0000000000000000
- 0.084738 | -9 | 4439112122.5928274334185666 | 4439112122.5928274334185666 | 0.0000000000000000
- 0.084738 | -8 | 376161483.0442710110530225 | 376161483.0442710110530225 | 0.0000000000000000
- 0.084738 | -7 | 31875171.7502054369346110 | 31875171.7502054369346110 | 0.0000000000000000
- 0.084738 | -6 | 2701038.3037689083149651 | 2701038.3037689083149651 | 0.0000000000000000
- 0.084738 | -5 | 228880.5837847697527935 | 228880.5837847697527935 | 0.0000000000000000
- 0.084738 | -4 | 19394.8829087538193122 | 19394.8829087538193122 | 0.0000000000000000
- 0.084738 | -3 | 1643.4835879219811409 | 1643.4835879219811409 | 0.0000000000000000
- 0.084738 | -2 | 139.2655122733328379 | 139.2655122733328379 | 0.0000000000000000
- 0.084738 | -1 | 11.8010809790176780 | 11.8010809790176780 | 0.0000000000000000
- 0.084738 | 0 | 1 | 1.0000000000000000 | 0.0000000000000000
- 0.084738 | 1 | 0.084738 | 0.0847380000000000 | 0.0000000000000000
- 0.084738 | 2 | 0.007180528644 | 0.0071805286440000 | 0.0000000000000000
- 0.084738 | 3 | 0.0006084636362353 | 0.0006084636362353 | 0.0000000000000000
- 0.084738 | 4 | 0.0000515599916073 | 0.0000515599916073 | 0.0000000000000000
- 0.084738 | 5 | 0.0000043690905688 | 0.0000043690905688 | 0.0000000000000000
- 0.084738 | 6 | 0.0000003702279966 | 0.0000003702279966 | 0.0000000000000000
- 0.084738 | 7 | 0.0000000313723800 | 0.0000000313723800 | 0.0000000000000000
- 0.084738 | 8 | 0.0000000026584327 | 0.0000000026584327 | 0.0000000000000000
- 0.084738 | 9 | 0.0000000002252703 | 0.0000000002252703 | 0.0000000000000000
- 0.084738 | 10 | 0.0000000000190890 | 0.0000000000190890 | 0.0000000000000000
- 0.084738 | 11 | 0.0000000000016176 | 0.0000000000016176 | 0.0000000000000000
- 0.084738 | 12 | 0.0000000000001371 | 0.0000000000001371 | 0.0000000000000000
- 0.084738 | 13 | 0.0000000000000116 | 0.0000000000000116 | 0.0000000000000000
- 0.084738 | 14 | 0.0000000000000010 | 0.0000000000000010 | 0.0000000000000000
- 0.084738 | 15 | 0.0000000000000001 | 0.0000000000000001 | 0.0000000000000000
- 0.084738 | 16 | 0.0000000000000000 | 0.0000000000000000 | 0.0000000000000000
- 0.084738 | 17 | 0.0000000000000000 | 0.0000000000000000 | 0.0000000000000000
- 0.084738 | 18 | 0.0000000000000000 | 0.0000000000000000 | 0.0000000000000000
- 0.084738 | 19 | 0.0000000000000000 | 0.0000000000000000 | 0.0000000000000000
- 0.084738 | 20 | 0.0000000000000000 | 0.0000000000000000 | 0.0000000000000000
+ b | p | bc_result | power | diff
+----------+-----+-----------------------------------------+-----------------------------------------+-----------------------------------------
+ 0.084738 | -20 | 2744326694304960114888.785913 | 2744326694304960114888.785913 | 0.000000
+ 0.084738 | -19 | 232548755422013710215.445941 | 232548755422013710215.445941 | 0.000000
+ 0.084738 | -18 | 19705716436950597776.236458 | 19705716436950597776.236458 | 0.000000
+ 0.084738 | -17 | 1669822999434319754.362725 | 1669822999434319754.362725 | 0.000000
+ 0.084738 | -16 | 141497461326065387.345189 | 141497461326065387.345189 | 0.000000
+ 0.084738 | -15 | 11990211877848128.792857 | 11990211877848128.792857 | 0.000000
+ 0.084738 | -14 | 1016026574105094.737649 | 1016026574105094.737649 | 0.000000
+ 0.084738 | -13 | 86096059836517.517879 | 86096059836517.517879 | 0.000000
+ 0.084738 | -12 | 7295607918426.821430 | 7295607918426.821430 | 0.000000
+ 0.084738 | -11 | 618215223791.651994 | 618215223791.651994 | 0.000000
+ 0.084738 | -10 | 52386321633.657007 | 52386321633.657007 | 0.000000
+ 0.084738 | -9 | 4439112122.5928274 | 4439112122.5928274 | 0.0000000
+ 0.084738 | -8 | 376161483.04427101 | 376161483.04427101 | 0.00000000
+ 0.084738 | -7 | 31875171.750205437 | 31875171.750205437 | 0.000000000
+ 0.084738 | -6 | 2701038.3037689083 | 2701038.3037689083 | 0.0000000000
+ 0.084738 | -5 | 228880.58378476975 | 228880.58378476975 | 0.00000000000
+ 0.084738 | -4 | 19394.882908753819 | 19394.882908753819 | 0.000000000000
+ 0.084738 | -3 | 1643.4835879219811 | 1643.4835879219811 | 0.0000000000000
+ 0.084738 | -2 | 139.26551227333284 | 139.26551227333284 | 0.00000000000000
+ 0.084738 | -1 | 11.801080979017678 | 11.801080979017678 | 0.000000000000000
+ 0.084738 | 0 | 1 | 1.0000000000000000 | 0.0000000000000000
+ 0.084738 | 1 | 0.084738 | 0.08473800000000000 | 0.00000000000000000
+ 0.084738 | 2 | 0.007180528644 | 0.007180528644000000 | 0.000000000000000000
+ 0.084738 | 3 | 0.000608463636235272 | 0.0006084636362352720 | 0.0000000000000000000
+ 0.084738 | 4 | 0.00005155999160730448 | 0.00005155999160730448 | 0.00000000000000000000
+ 0.084738 | 5 | 0.000004369090568819767 | 0.000004369090568819767 | 0.000000000000000000000
+ 0.084738 | 6 | 0.0000003702279966206494 | 0.0000003702279966206494 | 0.0000000000000000000000
+ 0.084738 | 7 | 0.00000003137237997764059 | 0.00000003137237997764059 | 0.00000000000000000000000
+ 0.084738 | 8 | 0.000000002658432734545308 | 0.000000002658432734545308 | 0.000000000000000000000000
+ 0.084738 | 9 | 0.0000000002252702730599003 | 0.0000000002252702730599003 | 0.0000000000000000000000000
+ 0.084738 | 10 | 0.00000000001908895239854983 | 0.00000000001908895239854983 | 0.00000000000000000000000000
+ 0.084738 | 11 | 0.000000000001617559648348316 | 0.000000000001617559648348316 | 0.000000000000000000000000000
+ 0.084738 | 12 | 0.0000000000001370687694817396 | 0.0000000000001370687694817396 | 0.0000000000000000000000000000
+ 0.084738 | 13 | 0.00000000000001161493338834365 | 0.00000000000001161493338834365 | 0.00000000000000000000000000000
+ 0.084738 | 14 | 0.0000000000000009842262254614642 | 0.0000000000000009842262254614642 | 0.0000000000000000000000000000000
+ 0.084738 | 15 | 0.00000000000000008340136189315355 | 0.00000000000000008340136189315355 | 0.00000000000000000000000000000000
+ 0.084738 | 16 | 0.000000000000000007067264604102046 | 0.000000000000000007067264604102046 | 0.000000000000000000000000000000000
+ 0.084738 | 17 | 0.0000000000000000005988658680223991 | 0.0000000000000000005988658680223991 | 0.0000000000000000000000000000000000
+ 0.084738 | 18 | 0.00000000000000000005074669592448206 | 0.00000000000000000005074669592448206 | 0.00000000000000000000000000000000000
+ 0.084738 | 19 | 0.000000000000000000004300173519248761 | 0.000000000000000000004300173519248761 | 0.000000000000000000000000000000000000
+ 0.084738 | 20 | 0.0000000000000000000003643881036741015 | 0.0000000000000000000003643881036741015 | 0.0000000000000000000000000000000000000
(41 rows)
-- base greater than 1
@@ -785,91 +785,91 @@ SELECT b, p, bc_result, b^p AS power, b^
-- echo "($b, $p, $r),"
-- done
WITH t(b, p, bc_result) AS (VALUES
-(37.821637, -20, .0000000000000000),
-(37.821637, -19, .0000000000000000),
-(37.821637, -18, .0000000000000000),
-(37.821637, -17, .0000000000000000),
-(37.821637, -16, .0000000000000000),
-(37.821637, -15, .0000000000000000),
-(37.821637, -14, .0000000000000000),
-(37.821637, -13, .0000000000000000),
-(37.821637, -12, .0000000000000000),
-(37.821637, -11, .0000000000000000),
-(37.821637, -10, .0000000000000002),
-(37.821637, -9, .0000000000000063),
-(37.821637, -8, .0000000000002388),
-(37.821637, -7, .0000000000090327),
-(37.821637, -6, .0000000003416316),
-(37.821637, -5, .0000000129210673),
-(37.821637, -4, .0000004886959182),
-(37.821637, -3, .0000184832796213),
-(37.821637, -2, .0006990678924066),
-(37.821637, -1, .0264398920649574),
+(37.821637, -20, .00000000000000000000000000000002787363175065101),
+(37.821637, -19, .000000000000000000000000000001054226381944797),
+(37.821637, -18, .00000000000000000000000000003987256753373947),
+(37.821637, -17, .000000000000000000000000001508045775519079),
+(37.821637, -16, .00000000000000000000000005703675990106610),
+(37.821637, -15, .000000000000000000000002157223628634278),
+(37.821637, -14, .00000000000000000000008158972901002847),
+(37.821637, -13, .000000000000000000003085857113545666),
+(37.821637, -12, .0000000000000000001167121675823920),
+(37.821637, -11, .000000000000000004414245235784397),
+(37.821637, -10, .0000000000000001669539809368169),
+(37.821637, -9, .000000000000006314472862697207),
+(37.821637, -8, .0000000000002388237004592846),
+(37.821637, -7, .000000000009032703305767796),
+(37.821637, -6, .0000000003416316255594496),
+(37.821637, -5, .00000001292106732962942),
+(37.821637, -4, .0000004886959181938034),
+(37.821637, -3, .00001848327962130773),
+(37.821637, -2, .0006990678924065984),
+(37.821637, -1, .02643989206495742),
(37.821637, 0, 1),
(37.821637, 1, 37.821637),
(37.821637, 2, 1430.476225359769),
-(37.821637, 3, 54102.9525326873775219),
-(37.821637, 4, 2046262.2313195326271135),
-(37.821637, 5, 77392987.3197773940323425),
-(37.821637, 6, 2927129472.7542235178972258),
-(37.821637, 7, 110708828370.5116321107718772),
-(37.821637, 8, 4187189119324.7924539711577286),
-(37.821637, 9, 158366346921451.9852944363360812),
-(37.821637, 10, 5989674486279224.5007355092228730),
-(37.821637, 11, 226539294168214309.7083246628376531),
-(37.821637, 12, 8568086950266418559.9938312759931069),
-(37.821637, 13, 324059074417413536066.1494087598581043),
-(37.821637, 14, 12256444679171401239980.3109258799733927),
-(37.821637, 15, 463558801566202198479885.2069857662592280),
-(37.821637, 16, 17532552720991931019508170.1002855156233684),
-(37.821637, 17, 663109844696719094948877928.0672523682648687),
-(37.821637, 18, 25079899837245684700124994552.6717306599041850),
-(37.821637, 19, 948562867640665366544581398598.1275771806665398),
-(37.821637, 20, 35876200451584291931921101974730.6901038166532866))
+(37.821637, 3, 54102.952532687378),
+(37.821637, 4, 2046262.2313195326),
+(37.821637, 5, 77392987.319777394),
+(37.821637, 6, 2927129472.7542235),
+(37.821637, 7, 110708828370.511632),
+(37.821637, 8, 4187189119324.792454),
+(37.821637, 9, 158366346921451.985294),
+(37.821637, 10, 5989674486279224.500736),
+(37.821637, 11, 226539294168214309.708325),
+(37.821637, 12, 8568086950266418559.993831),
+(37.821637, 13, 324059074417413536066.149409),
+(37.821637, 14, 12256444679171401239980.310926),
+(37.821637, 15, 463558801566202198479885.206986),
+(37.821637, 16, 17532552720991931019508170.100286),
+(37.821637, 17, 663109844696719094948877928.067252),
+(37.821637, 18, 25079899837245684700124994552.671731),
+(37.821637, 19, 948562867640665366544581398598.127577),
+(37.821637, 20, 35876200451584291931921101974730.690104))
SELECT b, p, bc_result, b^p AS power, b^p - bc_result AS diff FROM t;
- b | p | bc_result | power | diff
------------+-----+---------------------------------------------------+---------------------------------------------------+--------------------
- 37.821637 | -20 | 0.0000000000000000 | 0.0000000000000000 | 0.0000000000000000
- 37.821637 | -19 | 0.0000000000000000 | 0.0000000000000000 | 0.0000000000000000
- 37.821637 | -18 | 0.0000000000000000 | 0.0000000000000000 | 0.0000000000000000
- 37.821637 | -17 | 0.0000000000000000 | 0.0000000000000000 | 0.0000000000000000
- 37.821637 | -16 | 0.0000000000000000 | 0.0000000000000000 | 0.0000000000000000
- 37.821637 | -15 | 0.0000000000000000 | 0.0000000000000000 | 0.0000000000000000
- 37.821637 | -14 | 0.0000000000000000 | 0.0000000000000000 | 0.0000000000000000
- 37.821637 | -13 | 0.0000000000000000 | 0.0000000000000000 | 0.0000000000000000
- 37.821637 | -12 | 0.0000000000000000 | 0.0000000000000000 | 0.0000000000000000
- 37.821637 | -11 | 0.0000000000000000 | 0.0000000000000000 | 0.0000000000000000
- 37.821637 | -10 | 0.0000000000000002 | 0.0000000000000002 | 0.0000000000000000
- 37.821637 | -9 | 0.0000000000000063 | 0.0000000000000063 | 0.0000000000000000
- 37.821637 | -8 | 0.0000000000002388 | 0.0000000000002388 | 0.0000000000000000
- 37.821637 | -7 | 0.0000000000090327 | 0.0000000000090327 | 0.0000000000000000
- 37.821637 | -6 | 0.0000000003416316 | 0.0000000003416316 | 0.0000000000000000
- 37.821637 | -5 | 0.0000000129210673 | 0.0000000129210673 | 0.0000000000000000
- 37.821637 | -4 | 0.0000004886959182 | 0.0000004886959182 | 0.0000000000000000
- 37.821637 | -3 | 0.0000184832796213 | 0.0000184832796213 | 0.0000000000000000
- 37.821637 | -2 | 0.0006990678924066 | 0.0006990678924066 | 0.0000000000000000
- 37.821637 | -1 | 0.0264398920649574 | 0.0264398920649574 | 0.0000000000000000
- 37.821637 | 0 | 1 | 1.0000000000000000 | 0.0000000000000000
- 37.821637 | 1 | 37.821637 | 37.8216370000000000 | 0.0000000000000000
- 37.821637 | 2 | 1430.476225359769 | 1430.4762253597690000 | 0.0000000000000000
- 37.821637 | 3 | 54102.9525326873775219 | 54102.9525326873775219 | 0.0000000000000000
- 37.821637 | 4 | 2046262.2313195326271135 | 2046262.2313195326271135 | 0.0000000000000000
- 37.821637 | 5 | 77392987.3197773940323425 | 77392987.3197773940323425 | 0.0000000000000000
- 37.821637 | 6 | 2927129472.7542235178972258 | 2927129472.7542235178972258 | 0.0000000000000000
- 37.821637 | 7 | 110708828370.5116321107718772 | 110708828370.5116321107718772 | 0.0000000000000000
- 37.821637 | 8 | 4187189119324.7924539711577286 | 4187189119324.7924539711577286 | 0.0000000000000000
- 37.821637 | 9 | 158366346921451.9852944363360812 | 158366346921451.9852944363360812 | 0.0000000000000000
- 37.821637 | 10 | 5989674486279224.5007355092228730 | 5989674486279224.5007355092228730 | 0.0000000000000000
- 37.821637 | 11 | 226539294168214309.7083246628376531 | 226539294168214309.7083246628376531 | 0.0000000000000000
- 37.821637 | 12 | 8568086950266418559.9938312759931069 | 8568086950266418559.9938312759931069 | 0.0000000000000000
- 37.821637 | 13 | 324059074417413536066.1494087598581043 | 324059074417413536066.1494087598581043 | 0.0000000000000000
- 37.821637 | 14 | 12256444679171401239980.3109258799733927 | 12256444679171401239980.3109258799733927 | 0.0000000000000000
- 37.821637 | 15 | 463558801566202198479885.2069857662592280 | 463558801566202198479885.2069857662592280 | 0.0000000000000000
- 37.821637 | 16 | 17532552720991931019508170.1002855156233684 | 17532552720991931019508170.1002855156233684 | 0.0000000000000000
- 37.821637 | 17 | 663109844696719094948877928.0672523682648687 | 663109844696719094948877928.0672523682648687 | 0.0000000000000000
- 37.821637 | 18 | 25079899837245684700124994552.6717306599041850 | 25079899837245684700124994552.6717306599041850 | 0.0000000000000000
- 37.821637 | 19 | 948562867640665366544581398598.1275771806665398 | 948562867640665366544581398598.1275771806665398 | 0.0000000000000000
- 37.821637 | 20 | 35876200451584291931921101974730.6901038166532866 | 35876200451584291931921101974730.6901038166532866 | 0.0000000000000000
+ b | p | bc_result | power | diff
+-----------+-----+---------------------------------------------------+---------------------------------------------------+---------------------------------------------------
+ 37.821637 | -20 | 0.00000000000000000000000000000002787363175065101 | 0.00000000000000000000000000000002787363175065101 | 0.00000000000000000000000000000000000000000000000
+ 37.821637 | -19 | 0.000000000000000000000000000001054226381944797 | 0.000000000000000000000000000001054226381944797 | 0.000000000000000000000000000000000000000000000
+ 37.821637 | -18 | 0.00000000000000000000000000003987256753373947 | 0.00000000000000000000000000003987256753373947 | 0.00000000000000000000000000000000000000000000
+ 37.821637 | -17 | 0.000000000000000000000000001508045775519079 | 0.000000000000000000000000001508045775519079 | 0.000000000000000000000000000000000000000000
+ 37.821637 | -16 | 0.00000000000000000000000005703675990106610 | 0.00000000000000000000000005703675990106610 | 0.00000000000000000000000000000000000000000
+ 37.821637 | -15 | 0.000000000000000000000002157223628634278 | 0.000000000000000000000002157223628634278 | 0.000000000000000000000000000000000000000
+ 37.821637 | -14 | 0.00000000000000000000008158972901002847 | 0.00000000000000000000008158972901002847 | 0.00000000000000000000000000000000000000
+ 37.821637 | -13 | 0.000000000000000000003085857113545666 | 0.000000000000000000003085857113545666 | 0.000000000000000000000000000000000000
+ 37.821637 | -12 | 0.0000000000000000001167121675823920 | 0.0000000000000000001167121675823920 | 0.0000000000000000000000000000000000
+ 37.821637 | -11 | 0.000000000000000004414245235784397 | 0.000000000000000004414245235784397 | 0.000000000000000000000000000000000
+ 37.821637 | -10 | 0.0000000000000001669539809368169 | 0.0000000000000001669539809368169 | 0.0000000000000000000000000000000
+ 37.821637 | -9 | 0.000000000000006314472862697207 | 0.000000000000006314472862697207 | 0.000000000000000000000000000000
+ 37.821637 | -8 | 0.0000000000002388237004592846 | 0.0000000000002388237004592846 | 0.0000000000000000000000000000
+ 37.821637 | -7 | 0.000000000009032703305767796 | 0.000000000009032703305767796 | 0.000000000000000000000000000
+ 37.821637 | -6 | 0.0000000003416316255594496 | 0.0000000003416316255594496 | 0.0000000000000000000000000
+ 37.821637 | -5 | 0.00000001292106732962942 | 0.00000001292106732962942 | 0.00000000000000000000000
+ 37.821637 | -4 | 0.0000004886959181938034 | 0.0000004886959181938034 | 0.0000000000000000000000
+ 37.821637 | -3 | 0.00001848327962130773 | 0.00001848327962130773 | 0.00000000000000000000
+ 37.821637 | -2 | 0.0006990678924065984 | 0.0006990678924065984 | 0.0000000000000000000
+ 37.821637 | -1 | 0.02643989206495742 | 0.02643989206495742 | 0.00000000000000000
+ 37.821637 | 0 | 1 | 1.0000000000000000 | 0.0000000000000000
+ 37.821637 | 1 | 37.821637 | 37.821637000000000 | 0.000000000000000
+ 37.821637 | 2 | 1430.476225359769 | 1430.4762253597690 | 0.0000000000000
+ 37.821637 | 3 | 54102.952532687378 | 54102.952532687378 | 0.000000000000
+ 37.821637 | 4 | 2046262.2313195326 | 2046262.2313195326 | 0.0000000000
+ 37.821637 | 5 | 77392987.319777394 | 77392987.319777394 | 0.000000000
+ 37.821637 | 6 | 2927129472.7542235 | 2927129472.7542235 | 0.0000000
+ 37.821637 | 7 | 110708828370.511632 | 110708828370.511632 | 0.000000
+ 37.821637 | 8 | 4187189119324.792454 | 4187189119324.792454 | 0.000000
+ 37.821637 | 9 | 158366346921451.985294 | 158366346921451.985294 | 0.000000
+ 37.821637 | 10 | 5989674486279224.500736 | 5989674486279224.500736 | 0.000000
+ 37.821637 | 11 | 226539294168214309.708325 | 226539294168214309.708325 | 0.000000
+ 37.821637 | 12 | 8568086950266418559.993831 | 8568086950266418559.993831 | 0.000000
+ 37.821637 | 13 | 324059074417413536066.149409 | 324059074417413536066.149409 | 0.000000
+ 37.821637 | 14 | 12256444679171401239980.310926 | 12256444679171401239980.310926 | 0.000000
+ 37.821637 | 15 | 463558801566202198479885.206986 | 463558801566202198479885.206986 | 0.000000
+ 37.821637 | 16 | 17532552720991931019508170.100286 | 17532552720991931019508170.100286 | 0.000000
+ 37.821637 | 17 | 663109844696719094948877928.067252 | 663109844696719094948877928.067252 | 0.000000
+ 37.821637 | 18 | 25079899837245684700124994552.671731 | 25079899837245684700124994552.671731 | 0.000000
+ 37.821637 | 19 | 948562867640665366544581398598.127577 | 948562867640665366544581398598.127577 | 0.000000
+ 37.821637 | 20 | 35876200451584291931921101974730.690104 | 35876200451584291931921101974730.690104 | 0.000000
(41 rows)
--
diff --git a/src/test/regress/sql/numeric.sql b/src/test/regress/sql/numeric.sql
new file mode 100644
index eeca63d..d328b4b
--- a/src/test/regress/sql/numeric.sql
+++ b/src/test/regress/sql/numeric.sql
@@ -1162,6 +1162,10 @@ select (-1.0) ^ 2147483648;
select (-1.0) ^ 1000000000000000;
select (-1.0) ^ 1000000000000001;
+-- integer powers of 10
+select n, 10.0 ^ n as "10^n", (10.0 ^ n) * (10.0 ^ (-n)) = 1 as ok
+from generate_series(-20, 20) n;
+
--
-- Tests for raising to non-integer powers
--
diff --git a/src/test/regress/sql/numeric_big.sql b/src/test/regress/sql/numeric_big.sql
new file mode 100644
index c9d52d0..d67d9e8
--- a/src/test/regress/sql/numeric_big.sql
+++ b/src/test/regress/sql/numeric_big.sql
@@ -664,47 +664,47 @@ SELECT t1.id1, t1.result, t2.expected
-- done
WITH t(b, p, bc_result) AS (VALUES
-(0.084738, -20, 2744326694304960114888.7859130502035257),
-(0.084738, -19, 232548755422013710215.4459407000481464),
-(0.084738, -18, 19705716436950597776.2364581230406798),
-(0.084738, -17, 1669822999434319754.3627249884302211),
-(0.084738, -16, 141497461326065387.3451885900696001),
-(0.084738, -15, 11990211877848128.7928565907453178),
-(0.084738, -14, 1016026574105094.7376490817865767),
-(0.084738, -13, 86096059836517.5178789078924309),
-(0.084738, -12, 7295607918426.8214300228969888),
-(0.084738, -11, 618215223791.6519943372802450),
-(0.084738, -10, 52386321633.6570066961524534),
-(0.084738, -9, 4439112122.5928274334185666),
-(0.084738, -8, 376161483.0442710110530225),
-(0.084738, -7, 31875171.7502054369346110),
-(0.084738, -6, 2701038.3037689083149651),
-(0.084738, -5, 228880.5837847697527935),
-(0.084738, -4, 19394.8829087538193122),
-(0.084738, -3, 1643.4835879219811409),
-(0.084738, -2, 139.2655122733328379),
-(0.084738, -1, 11.8010809790176780),
+(0.084738, -20, 2744326694304960114888.785913),
+(0.084738, -19, 232548755422013710215.445941),
+(0.084738, -18, 19705716436950597776.236458),
+(0.084738, -17, 1669822999434319754.362725),
+(0.084738, -16, 141497461326065387.345189),
+(0.084738, -15, 11990211877848128.792857),
+(0.084738, -14, 1016026574105094.737649),
+(0.084738, -13, 86096059836517.517879),
+(0.084738, -12, 7295607918426.821430),
+(0.084738, -11, 618215223791.651994),
+(0.084738, -10, 52386321633.657007),
+(0.084738, -9, 4439112122.5928274),
+(0.084738, -8, 376161483.04427101),
+(0.084738, -7, 31875171.750205437),
+(0.084738, -6, 2701038.3037689083),
+(0.084738, -5, 228880.58378476975),
+(0.084738, -4, 19394.882908753819),
+(0.084738, -3, 1643.4835879219811),
+(0.084738, -2, 139.26551227333284),
+(0.084738, -1, 11.801080979017678),
(0.084738, 0, 1),
(0.084738, 1, .084738),
(0.084738, 2, .007180528644),
-(0.084738, 3, .0006084636362353),
-(0.084738, 4, .0000515599916073),
-(0.084738, 5, .0000043690905688),
-(0.084738, 6, .0000003702279966),
-(0.084738, 7, .0000000313723800),
-(0.084738, 8, .0000000026584327),
-(0.084738, 9, .0000000002252703),
-(0.084738, 10, .0000000000190890),
-(0.084738, 11, .0000000000016176),
-(0.084738, 12, .0000000000001371),
-(0.084738, 13, .0000000000000116),
-(0.084738, 14, .0000000000000010),
-(0.084738, 15, .0000000000000001),
-(0.084738, 16, .0000000000000000),
-(0.084738, 17, .0000000000000000),
-(0.084738, 18, .0000000000000000),
-(0.084738, 19, .0000000000000000),
-(0.084738, 20, .0000000000000000))
+(0.084738, 3, .000608463636235272),
+(0.084738, 4, .00005155999160730448),
+(0.084738, 5, .000004369090568819767),
+(0.084738, 6, .0000003702279966206494),
+(0.084738, 7, .00000003137237997764059),
+(0.084738, 8, .000000002658432734545308),
+(0.084738, 9, .0000000002252702730599003),
+(0.084738, 10, .00000000001908895239854983),
+(0.084738, 11, .000000000001617559648348316),
+(0.084738, 12, .0000000000001370687694817396),
+(0.084738, 13, .00000000000001161493338834365),
+(0.084738, 14, .0000000000000009842262254614642),
+(0.084738, 15, .00000000000000008340136189315355),
+(0.084738, 16, .000000000000000007067264604102046),
+(0.084738, 17, .0000000000000000005988658680223991),
+(0.084738, 18, .00000000000000000005074669592448206),
+(0.084738, 19, .000000000000000000004300173519248761),
+(0.084738, 20, .0000000000000000000003643881036741015))
SELECT b, p, bc_result, b^p AS power, b^p - bc_result AS diff FROM t;
-- base greater than 1
@@ -720,47 +720,47 @@ SELECT b, p, bc_result, b^p AS power, b^
-- done
WITH t(b, p, bc_result) AS (VALUES
-(37.821637, -20, .0000000000000000),
-(37.821637, -19, .0000000000000000),
-(37.821637, -18, .0000000000000000),
-(37.821637, -17, .0000000000000000),
-(37.821637, -16, .0000000000000000),
-(37.821637, -15, .0000000000000000),
-(37.821637, -14, .0000000000000000),
-(37.821637, -13, .0000000000000000),
-(37.821637, -12, .0000000000000000),
-(37.821637, -11, .0000000000000000),
-(37.821637, -10, .0000000000000002),
-(37.821637, -9, .0000000000000063),
-(37.821637, -8, .0000000000002388),
-(37.821637, -7, .0000000000090327),
-(37.821637, -6, .0000000003416316),
-(37.821637, -5, .0000000129210673),
-(37.821637, -4, .0000004886959182),
-(37.821637, -3, .0000184832796213),
-(37.821637, -2, .0006990678924066),
-(37.821637, -1, .0264398920649574),
+(37.821637, -20, .00000000000000000000000000000002787363175065101),
+(37.821637, -19, .000000000000000000000000000001054226381944797),
+(37.821637, -18, .00000000000000000000000000003987256753373947),
+(37.821637, -17, .000000000000000000000000001508045775519079),
+(37.821637, -16, .00000000000000000000000005703675990106610),
+(37.821637, -15, .000000000000000000000002157223628634278),
+(37.821637, -14, .00000000000000000000008158972901002847),
+(37.821637, -13, .000000000000000000003085857113545666),
+(37.821637, -12, .0000000000000000001167121675823920),
+(37.821637, -11, .000000000000000004414245235784397),
+(37.821637, -10, .0000000000000001669539809368169),
+(37.821637, -9, .000000000000006314472862697207),
+(37.821637, -8, .0000000000002388237004592846),
+(37.821637, -7, .000000000009032703305767796),
+(37.821637, -6, .0000000003416316255594496),
+(37.821637, -5, .00000001292106732962942),
+(37.821637, -4, .0000004886959181938034),
+(37.821637, -3, .00001848327962130773),
+(37.821637, -2, .0006990678924065984),
+(37.821637, -1, .02643989206495742),
(37.821637, 0, 1),
(37.821637, 1, 37.821637),
(37.821637, 2, 1430.476225359769),
-(37.821637, 3, 54102.9525326873775219),
-(37.821637, 4, 2046262.2313195326271135),
-(37.821637, 5, 77392987.3197773940323425),
-(37.821637, 6, 2927129472.7542235178972258),
-(37.821637, 7, 110708828370.5116321107718772),
-(37.821637, 8, 4187189119324.7924539711577286),
-(37.821637, 9, 158366346921451.9852944363360812),
-(37.821637, 10, 5989674486279224.5007355092228730),
-(37.821637, 11, 226539294168214309.7083246628376531),
-(37.821637, 12, 8568086950266418559.9938312759931069),
-(37.821637, 13, 324059074417413536066.1494087598581043),
-(37.821637, 14, 12256444679171401239980.3109258799733927),
-(37.821637, 15, 463558801566202198479885.2069857662592280),
-(37.821637, 16, 17532552720991931019508170.1002855156233684),
-(37.821637, 17, 663109844696719094948877928.0672523682648687),
-(37.821637, 18, 25079899837245684700124994552.6717306599041850),
-(37.821637, 19, 948562867640665366544581398598.1275771806665398),
-(37.821637, 20, 35876200451584291931921101974730.6901038166532866))
+(37.821637, 3, 54102.952532687378),
+(37.821637, 4, 2046262.2313195326),
+(37.821637, 5, 77392987.319777394),
+(37.821637, 6, 2927129472.7542235),
+(37.821637, 7, 110708828370.511632),
+(37.821637, 8, 4187189119324.792454),
+(37.821637, 9, 158366346921451.985294),
+(37.821637, 10, 5989674486279224.500736),
+(37.821637, 11, 226539294168214309.708325),
+(37.821637, 12, 8568086950266418559.993831),
+(37.821637, 13, 324059074417413536066.149409),
+(37.821637, 14, 12256444679171401239980.310926),
+(37.821637, 15, 463558801566202198479885.206986),
+(37.821637, 16, 17532552720991931019508170.100286),
+(37.821637, 17, 663109844696719094948877928.067252),
+(37.821637, 18, 25079899837245684700124994552.671731),
+(37.821637, 19, 948562867640665366544581398598.127577),
+(37.821637, 20, 35876200451584291931921101974730.690104))
SELECT b, p, bc_result, b^p AS power, b^p - bc_result AS diff FROM t;
--