------------------------------------------------------------------------
-- power0.decTest -- decimal exponentiation (simplified)              --
-- Copyright (c) IBM Corporation, 1981, 2008.  All rights reserved.   --
------------------------------------------------------------------------
-- Please see the document "General Decimal Arithmetic Testcases"     --
-- at http://www2.hursley.ibm.com/decimal for the description of      --
-- these testcases.                                                   --
--                                                                    --
-- These testcases are experimental ('beta' versions), and they       --
-- may contain errors.  They are offered on an as-is basis.  In       --
-- particular, achieving the same results as the tests here is not    --
-- a guarantee that an implementation complies with any Standard      --
-- or specification.  The tests are not exhaustive.                   --
--                                                                    --
-- Please send comments, suggestions, and corrections to the author:  --
--   Mike Cowlishaw, IBM Fellow                                       --
--   IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK         --
--   mfc@uk.ibm.com                                                   --
------------------------------------------------------------------------
version: 2.58

-- This set of testcases tests raising numbers to an integer power only.
-- If arbitrary powers were supported, 1 ulp differences would be
-- permitted.

extended:    0
precision:   9
rounding:    half_up
maxExponent: 999
minexponent: -999

pow001 power    '0'  '0'         -> '1'
pow002 power    '0'  '1'         -> '0'
pow003 power    '0'  '2'         -> '0'
pow004 power    '1'  '0'         -> '1'
pow005 power    '1'  '1'         -> '1'
pow006 power    '1'  '2'         -> '1'

pow010 power    '2'  '0'         -> '1'
pow011 power    '2'  '1'         -> '2'
pow012 power    '2'  '2'         -> '4'
pow013 power    '2'  '3'         -> '8'
pow014 power    '2'  '4'         -> '16'
pow015 power    '2'  '5'         -> '32'
pow016 power    '2'  '6'         -> '64'
pow017 power    '2'  '7'         -> '128'
pow018 power    '2'  '8'         -> '256'
pow019 power    '2'  '9'         -> '512'
pow020 power    '2'  '10'        -> '1024'
pow021 power    '2'  '11'        -> '2048'
pow022 power    '2'  '12'        -> '4096'
pow023 power    '2'  '15'        -> '32768'
pow024 power    '2'  '16'        -> '65536'
pow025 power    '2'  '31'        -> '2.14748365E+9' Inexact Rounded
-- NB 0 stripped in next
pow026 power    '2'  '32'        -> '4.2949673E+9' Inexact Rounded
precision: 10
pow027 power    '2'  '31'        -> '2147483648'
pow028 power    '2'  '32'        -> '4294967296'
precision: 9

pow030 power    '3'  '2'         -> 9
pow031 power    '4'  '2'         -> 16
pow032 power    '5'  '2'         -> 25
pow033 power    '6'  '2'         -> 36
pow034 power    '7'  '2'         -> 49
pow035 power    '8'  '2'         -> 64
pow036 power    '9'  '2'         -> 81
pow037 power    '10' '2'         -> 100
pow038 power    '11' '2'         -> 121
pow039 power    '12' '2'         -> 144

pow040 power    '3'  '3'         -> 27
pow041 power    '4'  '3'         -> 64
pow042 power    '5'  '3'         -> 125
pow043 power    '6'  '3'         -> 216
pow044 power    '7'  '3'         -> 343

pow050 power   '10'  '0'         -> 1
pow051 power   '10'  '1'         -> 10
pow052 power   '10'  '2'         -> 100
pow053 power   '10'  '3'         -> 1000
pow054 power   '10'  '4'         -> 10000
pow055 power   '10'  '5'         -> 100000
pow056 power   '10'  '6'         -> 1000000
pow057 power   '10'  '7'         -> 10000000
pow058 power   '10'  '8'         -> 100000000
pow059 power   '10'  '9'         -> 1E+9 Rounded
pow060 power   '10'  '22'        -> 1E+22 Rounded
pow061 power   '10'  '77'        -> 1E+77 Rounded
pow062 power   '10'  '99'        -> 1E+99 Rounded

maxexponent: 999999999
minexponent: -999999999
pow063 power   '10'  '999999999' -> '1E+999999999' Rounded
pow064 power   '10'  '999999998' -> '1E+999999998' Rounded
pow065 power   '10'  '999999997' -> '1E+999999997' Rounded
pow066 power   '10'  '333333333' -> '1E+333333333' Rounded
maxexponent: 999999
minexponent: -999999

pow070 power  '0.3'  '0'           -> '1'
pow071 power  '0.3'  '1'           -> '0.3'
pow072 power  '0.3'  '1.00'        -> '0.3'
pow073 power  '0.3'  '2.00'        -> '0.09'
pow074 power  '0.3'  '2.000000000' -> '0.09' Rounded
pow075 power  '6.0'  '2'           -> '36'
pow076 power   '-3'  '2'           -> '9'  -- from NetRexx book
pow077 power    '4'  '3'           -> '64' -- .. (sort of)

pow080 power   0.1    0            -> 1
pow081 power   0.1    1            -> 0.1
pow082 power   0.1    2            -> 0.01
pow083 power   0.1    3            -> 0.001
pow084 power   0.1    4            -> 0.0001
pow085 power   0.1    5            -> 0.00001
pow086 power   0.1    6            -> 0.000001
pow087 power   0.1    7            -> 1E-7
pow088 power   0.1    8            -> 1E-8
pow089 power   0.1    9            -> 1E-9

pow090 power   101    2            -> 10201
pow091 power   101    3            -> 1030301
pow092 power   101    4            -> 104060401
pow093 power   101    5            -> 1.05101005E+10 Inexact Rounded
pow094 power   101    6            -> 1.06152015E+12 Inexact Rounded
pow095 power   101    7            -> 1.07213535E+14 Inexact Rounded

-- negative powers
pow100 power  '0'  '-1'  -> ? Invalid_operation
pow101 power  '2'  '-1'  -> 0.5
pow102 power  '2'  '-2'  -> 0.25
pow103 power  '2'  '-4'  -> 0.0625
pow104 power  '2'  '-8'  -> 0.00390625
pow105 power  '2'  '-16' -> 0.0000152587891 Inexact Rounded
pow106 power  '2'  '-32' -> 2.32830644E-10 Inexact Rounded
pow108 power  '2'  '-64' -> 5.42101086E-20 Inexact Rounded
pow110 power  '10'  '-8' -> 1E-8
pow111 power  '10'  '-7' -> 1E-7
pow112 power  '10'  '-6' -> 0.000001
pow113 power  '10'  '-5' -> 0.00001
pow114 power  '10'  '-4' -> 0.0001
pow115 power  '10'  '-3' -> 0.001
pow116 power  '10'  '-2' -> 0.01
pow117 power  '10'  '-1' -> 0.1
maxexponent: 999999999
minexponent: -999999999
pow118 power  '10'  '-333333333'   -> 1E-333333333 Rounded
pow119 power  '10'  '-999999998'   -> 1E-999999998 Rounded
pow120 power  '10'  '-999999999'   -> 1E-999999999 Rounded
maxexponent: 999999
minexponent: -999999
pow121 power  '10'  '-77'          -> '1E-77' Rounded
pow122 power  '10'  '-22'          -> '1E-22' Rounded
pow123 power   '2'  '-1'           -> '0.5'
pow124 power   '2'  '-2'           -> '0.25'
pow125 power   '2'  '-4'           -> '0.0625'
pow126 power   '0'  '-1'           -> ? Invalid_operation
pow127 power   '0'  '-2'           -> ? Invalid_operation

-- out-of-range edge cases
maxexponent: 999999999
minexponent: -999999999
pow181 power   '7'   '999999998'   -> 2.10892313E+845098038 Inexact Rounded
pow182 power   '7'   '999999999'   -> 1.47624619E+845098039 Inexact Rounded
pow183 power   '7'   '1000000000'  -> ? Invalid_context Rounded
pow184 power   '7'   '1000000001'  -> ? Invalid_context Inexact Lost_digits Rounded
pow186 power   '7'   '-1000000001' -> 9.67705411E-845098041 Inexact Lost_digits Rounded
pow187 power   '7'   '-1000000000' -> 9.67705411E-845098041 Inexact Rounded
pow189 power   '7'   '-999999999'  -> 6.77393787E-845098040 Inexact Rounded
pow190 power   '7'   '-999999998'  -> 4.74175651E-845098039 Inexact Rounded

maxexponent: 999999
minexponent: -999999

-- "0.5" tests from original Rexx diagnostics [loop unrolled]
pow200 power   0.5    0            -> 1
pow201 power   0.5    1            -> 0.5
pow202 power   0.5    2            -> 0.25
pow203 power   0.5    3            -> 0.125
pow204 power   0.5    4            -> 0.0625
pow205 power   0.5    5            -> 0.03125
pow206 power   0.5    6            -> 0.015625
pow207 power   0.5    7            -> 0.0078125
pow208 power   0.5    8            -> 0.00390625
pow209 power   0.5    9            -> 0.001953125
pow210 power   0.5   10            -> 0.0009765625

-- A (rare) case where the last digit is not within 0.5 ULP
maxexponent: 999999999
minexponent: -999999999
precision: 9
pow215 power "-21971575.0E+31454441" "-7" -> "-4.04549502E-220181139" Inexact Rounded
precision: 20
pow216 power "-21971575.0E+31454441" "-7" -> "-4.0454950249324891788E-220181139" Inexact Rounded
maxexponent: 999999
minexponent: -999999

-- The Vienna case.  Checks both setup and 1/acc working precision
-- Modified 1998.12.14 as RHS no longer rounded before use (must fit)
-- Modified 1990.02.04 as LHS is now rounded (instead of truncated to guard)
--    '123456789E+10'    -- lhs .. rounded to 1.23E+18
--    '-1.23000e+2'      -- rhs .. [was: -1.23455e+2, rounds to -123]
-- Without the input rounding, result would be 5.54E-2226
precision: 3
pow220 power '123456789E+10' '-1.23000e+2' -> '8.74E-2226' Inexact Lost_digits Rounded

precision: 5
pow240 power 1      99999 -> 1
pow241 power 1     100000 -> 1  Rounded
pow242 power 1     100001 -> 1  Inexact Rounded Lost_digits
pow243 power 1 1000000000 -> 1  Rounded
pow244 power 1 9999999999 -> 1  Inexact Rounded Lost_digits

-- Checks for 'Too much precision needed'
-- For x^12, digits+elength+1 = digits+3
precision: 999999999
--SSC: pow249 add 1 1 -> 2   -- check basic operation at this precision
pow250 power          2 12  -> ? Overflow
precision: 999999998
pow251 power          2 12  -> ? Overflow
precision: 999999997
pow252 power          2 12  -> ? Overflow
precision: 999999996
pow253 power          2 12  -> 4096
precision: 999999995
pow254 power          2 12  -> 4096


-- overflow and underflow tests
maxexponent: 999999999
minexponent: -999999999
precision: 9
pow260 power  9            999999999 -> 3.05550054E+954242508 Inexact Rounded
pow261 power 10            999999999 -> 1E+999999999 Rounded
pow262 power 10.0001       999999999 -> ? Overflow Inexact Rounded
pow263 power 10.1          999999999 -> ? Overflow Inexact Rounded
pow264 power 11            999999999 -> ? Overflow Inexact Rounded
pow265 power 12            999999999 -> ? Overflow Inexact Rounded
pow266 power 999           999999999 -> ? Overflow Inexact Rounded
pow267 power 999999        999999999 -> ? Overflow Inexact Rounded
pow268 power 999999999     999999999 -> ? Overflow Inexact Rounded
pow269 power 9.9E999999999 999999999 -> ? Overflow Inexact Rounded

pow270 power 0.5           999999999 -> 4.33559594E-301029996 Inexact Rounded
pow271 power 0.1           999999999 -> 1E-999999999
pow272 power 0.09          999999999 -> ? Underflow Subnormal Inexact Rounded
pow273 power 0.05          999999999 -> ? Underflow Subnormal Inexact Rounded
pow274 power 0.01          999999999 -> ? Underflow Subnormal Inexact Rounded
pow275 power 0.0001        999999999 -> ? Underflow Subnormal Inexact Rounded
pow277 power 0.0000001     999999999 -> ? Underflow Subnormal Inexact Rounded
pow278 power 0.0000000001  999999999 -> ? Underflow Subnormal Inexact Rounded
pow279 power 1E-999999999  999999999 -> ? Underflow Subnormal Inexact Rounded

pow310 power -9             999999999 -> -3.05550054E+954242508 Inexact Rounded
pow311 power -10            999999999 -> -1E+999999999 Rounded
pow312 power -10.0001       999999999 -> ? Overflow Inexact Rounded
pow313 power -10.1          999999999 -> ? Overflow Inexact Rounded
pow314 power -11            999999999 -> ? Overflow Inexact Rounded
pow315 power -12            999999999 -> ? Overflow Inexact Rounded
pow316 power -999           999999999 -> ? Overflow Inexact Rounded
pow317 power -999999        999999999 -> ? Overflow Inexact Rounded
pow318 power -999999999     999999999 -> ? Overflow Inexact Rounded
pow319 power -9.9E999999999 999999999 -> ? Overflow Inexact Rounded

pow320 power -0.5           999999999 -> -4.33559594E-301029996 Inexact Rounded
pow321 power -0.1           999999999 -> -1E-999999999
pow322 power -0.09          999999999 -> ? Underflow Subnormal Inexact Rounded
pow323 power -0.05          999999999 -> ? Underflow Subnormal Inexact Rounded
pow324 power -0.01          999999999 -> ? Underflow Subnormal Inexact Rounded
pow325 power -0.0001        999999999 -> ? Underflow Subnormal Inexact Rounded
pow327 power -0.0000001     999999999 -> ? Underflow Subnormal Inexact Rounded
pow328 power -0.0000000001  999999999 -> ? Underflow Subnormal Inexact Rounded
pow329 power -1E-999999999  999999999 -> ? Underflow Subnormal Inexact Rounded

pow330 power -9             999999998 ->  3.3950006E+954242507 Inexact Rounded
pow331 power -10            999999998 ->  1E+999999998 Rounded
pow332 power -10.0001       999999998 ->  ? Overflow Inexact Rounded
pow333 power -10.1          999999998 ->  ? Overflow Inexact Rounded
pow334 power -11            999999998 ->  ? Overflow Inexact Rounded
pow335 power -12            999999998 ->  ? Overflow Inexact Rounded
pow336 power -999           999999998 ->  ? Overflow Inexact Rounded
pow337 power -999999        999999998 ->  ? Overflow Inexact Rounded
pow338 power -999999999     999999998 ->  ? Overflow Inexact Rounded
pow339 power -9.9E999999999 999999998 ->  ? Overflow Inexact Rounded

pow340 power -0.5           999999998 ->  8.67119187E-301029996 Inexact Rounded
pow341 power -0.1           999999998 ->  1E-999999998
pow342 power -0.09          999999998 ->  ? Underflow Subnormal Inexact Rounded
pow343 power -0.05          999999998 ->  ? Underflow Subnormal Inexact Rounded
pow344 power -0.01          999999998 ->  ? Underflow Subnormal Inexact Rounded
pow345 power -0.0001        999999998 ->  ? Underflow Subnormal Inexact Rounded
pow347 power -0.0000001     999999998 ->  ? Underflow Subnormal Inexact Rounded
pow348 power -0.0000000001  999999998 ->  ? Underflow Subnormal Inexact Rounded
pow349 power -1E-999999999  999999998 ->  ? Underflow Subnormal Inexact Rounded

-- lostDigits and RHS range checks
maxexponent: 999
minexponent: -999
precision: 9
pow401 power 12345678000 1 -> 1.2345678E+10 Rounded
pow402 power 1234567800  1 -> 1.2345678E+9 Rounded
pow403 power 1234567890  1 -> 1.23456789E+9 Rounded
pow404 power 1234567891  1 -> 1.23456789E+9 Inexact Lost_digits Rounded
pow405 power 12345678901 1 -> 1.23456789E+10 Inexact Lost_digits Rounded
pow406 power 1234567896  1 -> 1.2345679E+9 Inexact Lost_digits Rounded

precision: 15
-- still checking for [no] lostDigits
pow441 power 12345678000 1 -> 12345678000
pow442 power 1234567800  1 -> 1234567800
pow443 power 1234567890  1 -> 1234567890
pow444 power 1234567891  1 -> 1234567891
pow445 power 12345678901 1 -> 12345678901
pow446 power 1234567896  1 -> 1234567896
pow447 power 1 12345678000  -> 1
pow448 power 1 -1234567896  -> 1
pow449 power 1 1000000000   -> 1
pow440 power 1 -1000000000  -> 1

-- Null tests
pow500 power  1 # -> ? Invalid_operation
pow501 power  # 1 -> ? Invalid_operation

----------------------------------------------------------------------
-- Below here are the tests with a non-integer rhs, including the   --
-- tests that previously caused Invalid operation.  An integer-only --
-- (on rhs) implementation should handle all the tests above as     --
-- shown, and flag most of the following tests as Invalid.          --
----------------------------------------------------------------------
precision:   16
rounding:    half_up
maxExponent: 384
minExponent: -383

pow2000 power 7 '10000000000'        -> ? Overflow Inexact Rounded
pow2001 power 2 '2.000001'           -> 4.000002772589683 Inexact Rounded
pow2002 power 2 '2.00000000'         -> 4
pow2003 power 2 '2.000000001'        -> 4.000000002772589 Inexact Rounded
pow2004 power 2 '2.0000000001'       -> 4.000000000277259 Inexact Rounded
pow2005 power 2 '2.00000000001'      -> 4.000000000027726 Inexact Rounded
pow2006 power 2 '2.000000000001'     -> 4.000000000002773 Inexact Rounded
pow2007 power 2 '2.0000000000001'    -> 4.000000000000277 Inexact Rounded
pow2008 power 2 '2.00000000000001'   -> 4.000000000000028 Inexact Rounded
pow2009 power 2 '2.000000000000001'  -> 4.000000000000003 Inexact Rounded
pow2010 power 2 '2.0000000000000001' -> 4                 Inexact Rounded Lost_digits
--               1 234567890123456

pow2011 power 1 1234 -> 1
precision: 4
pow2012 power 1 1234 -> 1
precision: 3
pow2013 power 1 1234     -> 1 Inexact Rounded Lost_digits
pow2014 power 1 12.34e+2 -> 1 Inexact Rounded Lost_digits
pow2015 power 1 12.3     -> 1 Inexact Rounded
pow2016 power 1 12.0     -> 1
pow2017 power 1 1.01     -> 1 Inexact Rounded
pow2018 power 2 1.00     -> 2
pow2019 power 2 2.00     -> 4
precision: 9
pow2030 power 1 1.0001           -> 1 Inexact Rounded
pow2031 power 1 1.0000001        -> 1 Inexact Rounded
pow2032 power 1 1.0000000001     -> 1 Inexact Rounded Lost_digits
pow2033 power 1 1.0000000000001  -> 1 Inexact Rounded Lost_digits
precision: 5
pow2034 power 1 1.0001           -> 1 Inexact Rounded
pow2035 power 1 1.0000001        -> 1 Inexact Rounded Lost_digits
pow2036 power 1 1.0000000001     -> 1 Inexact Rounded Lost_digits
pow2037 power 1 1.0000000000001  -> 1 Inexact Rounded Lost_digits
pow2038 power 1 1.0000000000001  -> 1 Inexact Rounded Lost_digits

-- 1 ** big integer should be exact if no input rounding
precision: 15
pow2041 power 1 1000000000   -> 1
pow2042 power 1 9999999999   -> 1
pow2043 power 1 12345678000  -> 1
pow2044 power 1 1234567800   -> 1
pow2045 power 1 1234567890   -> 1
pow2046 power 1 11234567891  -> 1
pow2047 power 1 12345678901  -> 1
pow2048 power 1 1234567896   -> 1
pow2049 power 1 -1234567896  -> 1
pow2051 power 1 1000000000   -> 1
pow2052 power 1 -1000000000  -> 1
pow2053 power 1 12345678000  -> 1
pow2054 power 1 -1234567896  -> 1
pow2055 power 1 1000000000   -> 1
pow2056 power 1 -1000000000  -> 1

-- (Other x**y results tested in power.decTest)