------------------------------------------------------------------------ -- ddEncode.decTest -- decimal eight-byte format testcases -- -- Copyright (c) Mike Cowlishaw, 1981, 2010. All rights reserved. -- -- Parts copyright (c) IBM Corporation, 1981, 2008. -- ------------------------------------------------------------------------ -- Please see the document "General Decimal Arithmetic Testcases" -- -- at http://speleotrove.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, mfc@speleotrove.com -- ------------------------------------------------------------------------ version: 2.62 -- This set of tests is for the eight-byte concrete representation. -- Its characteristics are: -- -- 1 bit sign -- 5 bits combination field -- 8 bits exponent continuation -- 50 bits coefficient continuation -- -- Total exponent length 10 bits -- Total coefficient length 54 bits (16 digits) -- -- Elimit = 767 (maximum encoded exponent) -- Emax = 384 (largest exponent value) -- Emin = -383 (smallest exponent value) -- bias = 398 (subtracted from encoded exponent) = -Etiny -- The testcases here have only exactly representable data on the -- 'left-hand-side'; rounding from strings is tested in 'base' -- testcase groups. extended: 1 clamp: 1 precision: 16 rounding: half_up maxExponent: 384 minExponent: -383 -- General testcases -- (mostly derived from the Strawman 4 document and examples) dece001 apply #A2300000000003D0 -> -7.50 dece002 apply -7.50 -> #A2300000000003D0 -- derivative canonical plain strings dece003 apply #A23c0000000003D0 -> -7.50E+3 dece004 apply -7.50E+3 -> #A23c0000000003D0 dece005 apply #A2380000000003D0 -> -750 dece006 apply -750 -> #A2380000000003D0 dece007 apply #A2340000000003D0 -> -75.0 dece008 apply -75.0 -> #A2340000000003D0 dece009 apply #A22c0000000003D0 -> -0.750 dece010 apply -0.750 -> #A22c0000000003D0 dece011 apply #A2280000000003D0 -> -0.0750 dece012 apply -0.0750 -> #A2280000000003D0 dece013 apply #A2200000000003D0 -> -0.000750 dece014 apply -0.000750 -> #A2200000000003D0 dece015 apply #A2180000000003D0 -> -0.00000750 dece016 apply -0.00000750 -> #A2180000000003D0 dece017 apply #A2140000000003D0 -> -7.50E-7 dece018 apply -7.50E-7 -> #A2140000000003D0 -- Normality dece020 apply 1234567890123456 -> #263934b9c1e28e56 dece021 apply -1234567890123456 -> #a63934b9c1e28e56 dece022 apply 1234.567890123456 -> #260934b9c1e28e56 dece023 apply #260934b9c1e28e56 -> 1234.567890123456 dece024 apply 1111111111111111 -> #2638912449124491 dece025 apply 9999999999999999 -> #6e38ff3fcff3fcff -- Nmax and similar dece031 apply 9999999999999999E+369 -> #77fcff3fcff3fcff dece032 apply 9.999999999999999E+384 -> #77fcff3fcff3fcff dece033 apply #77fcff3fcff3fcff -> 9.999999999999999E+384 dece034 apply 1.234567890123456E+384 -> #47fd34b9c1e28e56 dece035 apply #47fd34b9c1e28e56 -> 1.234567890123456E+384 -- fold-downs (more below) dece036 apply 1.23E+384 -> #47fd300000000000 Clamped dece037 apply #47fd300000000000 -> 1.230000000000000E+384 decd038 apply 1E+384 -> #47fc000000000000 Clamped decd039 apply #47fc000000000000 -> 1.000000000000000E+384 decd051 apply 12345 -> #22380000000049c5 decd052 apply #22380000000049c5 -> 12345 decd053 apply 1234 -> #2238000000000534 decd054 apply #2238000000000534 -> 1234 decd055 apply 123 -> #22380000000000a3 decd056 apply #22380000000000a3 -> 123 decd057 apply 12 -> #2238000000000012 decd058 apply #2238000000000012 -> 12 decd059 apply 1 -> #2238000000000001 decd060 apply #2238000000000001 -> 1 decd061 apply 1.23 -> #22300000000000a3 decd062 apply #22300000000000a3 -> 1.23 decd063 apply 123.45 -> #22300000000049c5 decd064 apply #22300000000049c5 -> 123.45 -- Nmin and below decd071 apply 1E-383 -> #003c000000000001 decd072 apply #003c000000000001 -> 1E-383 decd073 apply 1.000000000000000E-383 -> #0400000000000000 decd074 apply #0400000000000000 -> 1.000000000000000E-383 decd075 apply 1.000000000000001E-383 -> #0400000000000001 decd076 apply #0400000000000001 -> 1.000000000000001E-383 decd077 apply 0.100000000000000E-383 -> #0000800000000000 Subnormal decd078 apply #0000800000000000 -> 1.00000000000000E-384 Subnormal decd079 apply 0.000000000000010E-383 -> #0000000000000010 Subnormal decd080 apply #0000000000000010 -> 1.0E-397 Subnormal decd081 apply 0.00000000000001E-383 -> #0004000000000001 Subnormal decd082 apply #0004000000000001 -> 1E-397 Subnormal decd083 apply 0.000000000000001E-383 -> #0000000000000001 Subnormal decd084 apply #0000000000000001 -> 1E-398 Subnormal -- next is smallest all-nines decd085 apply 9999999999999999E-398 -> #6400ff3fcff3fcff decd086 apply #6400ff3fcff3fcff -> 9.999999999999999E-383 -- and a problematic divide result decd088 apply 1.111111111111111E-383 -> #0400912449124491 decd089 apply #0400912449124491 -> 1.111111111111111E-383 -- forties decd090 apply 40 -> #2238000000000040 decd091 apply 39.99 -> #2230000000000cff -- underflows cannot be tested as all LHS exact -- Same again, negatives -- Nmax and similar decd122 apply -9.999999999999999E+384 -> #f7fcff3fcff3fcff decd123 apply #f7fcff3fcff3fcff -> -9.999999999999999E+384 decd124 apply -1.234567890123456E+384 -> #c7fd34b9c1e28e56 decd125 apply #c7fd34b9c1e28e56 -> -1.234567890123456E+384 -- fold-downs (more below) decd130 apply -1.23E+384 -> #c7fd300000000000 Clamped decd131 apply #c7fd300000000000 -> -1.230000000000000E+384 decd132 apply -1E+384 -> #c7fc000000000000 Clamped decd133 apply #c7fc000000000000 -> -1.000000000000000E+384 -- overflows decd151 apply -12345 -> #a2380000000049c5 decd152 apply #a2380000000049c5 -> -12345 decd153 apply -1234 -> #a238000000000534 decd154 apply #a238000000000534 -> -1234 decd155 apply -123 -> #a2380000000000a3 decd156 apply #a2380000000000a3 -> -123 decd157 apply -12 -> #a238000000000012 decd158 apply #a238000000000012 -> -12 decd159 apply -1 -> #a238000000000001 decd160 apply #a238000000000001 -> -1 decd161 apply -1.23 -> #a2300000000000a3 decd162 apply #a2300000000000a3 -> -1.23 decd163 apply -123.45 -> #a2300000000049c5 decd164 apply #a2300000000049c5 -> -123.45 -- Nmin and below decd171 apply -1E-383 -> #803c000000000001 decd172 apply #803c000000000001 -> -1E-383 decd173 apply -1.000000000000000E-383 -> #8400000000000000 decd174 apply #8400000000000000 -> -1.000000000000000E-383 decd175 apply -1.000000000000001E-383 -> #8400000000000001 decd176 apply #8400000000000001 -> -1.000000000000001E-383 decd177 apply -0.100000000000000E-383 -> #8000800000000000 Subnormal decd178 apply #8000800000000000 -> -1.00000000000000E-384 Subnormal decd179 apply -0.000000000000010E-383 -> #8000000000000010 Subnormal decd180 apply #8000000000000010 -> -1.0E-397 Subnormal decd181 apply -0.00000000000001E-383 -> #8004000000000001 Subnormal decd182 apply #8004000000000001 -> -1E-397 Subnormal decd183 apply -0.000000000000001E-383 -> #8000000000000001 Subnormal decd184 apply #8000000000000001 -> -1E-398 Subnormal -- next is smallest all-nines decd185 apply -9999999999999999E-398 -> #e400ff3fcff3fcff decd186 apply #e400ff3fcff3fcff -> -9.999999999999999E-383 -- and a tricky subnormal decd187 apply 1.11111111111524E-384 -> #00009124491246a4 Subnormal decd188 apply #00009124491246a4 -> 1.11111111111524E-384 Subnormal -- near-underflows decd189 apply -1e-398 -> #8000000000000001 Subnormal decd190 apply -1.0e-398 -> #8000000000000001 Subnormal Rounded -- zeros decd401 apply 0E-500 -> #0000000000000000 Clamped decd402 apply 0E-400 -> #0000000000000000 Clamped decd403 apply 0E-398 -> #0000000000000000 decd404 apply #0000000000000000 -> 0E-398 decd405 apply 0.000000000000000E-383 -> #0000000000000000 decd406 apply #0000000000000000 -> 0E-398 decd407 apply 0E-2 -> #2230000000000000 decd408 apply #2230000000000000 -> 0.00 decd409 apply 0 -> #2238000000000000 decd410 apply #2238000000000000 -> 0 decd411 apply 0E+3 -> #2244000000000000 decd412 apply #2244000000000000 -> 0E+3 decd413 apply 0E+369 -> #43fc000000000000 decd414 apply #43fc000000000000 -> 0E+369 -- clamped zeros... decd415 apply 0E+370 -> #43fc000000000000 Clamped decd416 apply #43fc000000000000 -> 0E+369 decd417 apply 0E+384 -> #43fc000000000000 Clamped decd418 apply #43fc000000000000 -> 0E+369 decd419 apply 0E+400 -> #43fc000000000000 Clamped decd420 apply #43fc000000000000 -> 0E+369 decd421 apply 0E+500 -> #43fc000000000000 Clamped decd422 apply #43fc000000000000 -> 0E+369 -- negative zeros decd431 apply -0E-400 -> #8000000000000000 Clamped decd432 apply -0E-400 -> #8000000000000000 Clamped decd433 apply -0E-398 -> #8000000000000000 decd434 apply #8000000000000000 -> -0E-398 decd435 apply -0.000000000000000E-383 -> #8000000000000000 decd436 apply #8000000000000000 -> -0E-398 decd437 apply -0E-2 -> #a230000000000000 decd438 apply #a230000000000000 -> -0.00 decd439 apply -0 -> #a238000000000000 decd440 apply #a238000000000000 -> -0 decd441 apply -0E+3 -> #a244000000000000 decd442 apply #a244000000000000 -> -0E+3 decd443 apply -0E+369 -> #c3fc000000000000 decd444 apply #c3fc000000000000 -> -0E+369 -- clamped zeros... decd445 apply -0E+370 -> #c3fc000000000000 Clamped decd446 apply #c3fc000000000000 -> -0E+369 decd447 apply -0E+384 -> #c3fc000000000000 Clamped decd448 apply #c3fc000000000000 -> -0E+369 decd449 apply -0E+400 -> #c3fc000000000000 Clamped decd450 apply #c3fc000000000000 -> -0E+369 decd451 apply -0E+500 -> #c3fc000000000000 Clamped decd452 apply #c3fc000000000000 -> -0E+369 -- exponents decd460 apply #225c000000000007 -> 7E+9 decd461 apply 7E+9 -> #225c000000000007 decd462 apply #23c4000000000007 -> 7E+99 decd463 apply 7E+99 -> #23c4000000000007 -- Specials decd500 apply Infinity -> #7800000000000000 decd501 apply #7878787878787878 -> #7800000000000000 decd502 apply #7800000000000000 -> Infinity decd503 apply #7979797979797979 -> #7800000000000000 decd504 apply #7900000000000000 -> Infinity decd505 apply #7a7a7a7a7a7a7a7a -> #7800000000000000 decd506 apply #7a00000000000000 -> Infinity decd507 apply #7b7b7b7b7b7b7b7b -> #7800000000000000 decd508 apply #7b00000000000000 -> Infinity decd509 apply NaN -> #7c00000000000000 decd510 apply #7c7c7c7c7c7c7c7c -> #7c007c7c7c7c7c7c decd511 apply #7c00000000000000 -> NaN decd512 apply #7d7d7d7d7d7d7d7d -> #7c017d7d7d7d7d7d decd513 apply #7d00000000000000 -> NaN decd514 apply #7e7e7e7e7e7e7e7e -> #7e007e7e7e7e7c7e decd515 apply #7e00000000000000 -> sNaN decd516 apply #7f7f7f7f7f7f7f7f -> #7e007f7f7f7f7c7f decd517 apply #7f00000000000000 -> sNaN decd518 apply #7fffffffffffffff -> sNaN999999999999999 decd519 apply #7fffffffffffffff -> #7e00ff3fcff3fcff decd520 apply -Infinity -> #f800000000000000 decd521 apply #f878787878787878 -> #f800000000000000 decd522 apply #f800000000000000 -> -Infinity decd523 apply #f979797979797979 -> #f800000000000000 decd524 apply #f900000000000000 -> -Infinity decd525 apply #fa7a7a7a7a7a7a7a -> #f800000000000000 decd526 apply #fa00000000000000 -> -Infinity decd527 apply #fb7b7b7b7b7b7b7b -> #f800000000000000 decd528 apply #fb00000000000000 -> -Infinity decd529 apply -NaN -> #fc00000000000000 decd530 apply #fc7c7c7c7c7c7c7c -> #fc007c7c7c7c7c7c decd531 apply #fc00000000000000 -> -NaN decd532 apply #fd7d7d7d7d7d7d7d -> #fc017d7d7d7d7d7d decd533 apply #fd00000000000000 -> -NaN decd534 apply #fe7e7e7e7e7e7e7e -> #fe007e7e7e7e7c7e decd535 apply #fe00000000000000 -> -sNaN decd536 apply #ff7f7f7f7f7f7f7f -> #fe007f7f7f7f7c7f decd537 apply #ff00000000000000 -> -sNaN decd538 apply #ffffffffffffffff -> -sNaN999999999999999 decd539 apply #ffffffffffffffff -> #fe00ff3fcff3fcff -- diagnostic NaNs decd540 apply NaN -> #7c00000000000000 decd541 apply NaN0 -> #7c00000000000000 decd542 apply NaN1 -> #7c00000000000001 decd543 apply NaN12 -> #7c00000000000012 decd544 apply NaN79 -> #7c00000000000079 decd545 apply NaN12345 -> #7c000000000049c5 decd546 apply NaN123456 -> #7c00000000028e56 decd547 apply NaN799799 -> #7c000000000f7fdf decd548 apply NaN799799799799799 -> #7c03dff7fdff7fdf decd549 apply NaN999999999999999 -> #7c00ff3fcff3fcff -- too many digits -- fold-down full sequence decd601 apply 1E+384 -> #47fc000000000000 Clamped decd602 apply #47fc000000000000 -> 1.000000000000000E+384 decd603 apply 1E+383 -> #43fc800000000000 Clamped decd604 apply #43fc800000000000 -> 1.00000000000000E+383 decd605 apply 1E+382 -> #43fc100000000000 Clamped decd606 apply #43fc100000000000 -> 1.0000000000000E+382 decd607 apply 1E+381 -> #43fc010000000000 Clamped decd608 apply #43fc010000000000 -> 1.000000000000E+381 decd609 apply 1E+380 -> #43fc002000000000 Clamped decd610 apply #43fc002000000000 -> 1.00000000000E+380 decd611 apply 1E+379 -> #43fc000400000000 Clamped decd612 apply #43fc000400000000 -> 1.0000000000E+379 decd613 apply 1E+378 -> #43fc000040000000 Clamped decd614 apply #43fc000040000000 -> 1.000000000E+378 decd615 apply 1E+377 -> #43fc000008000000 Clamped decd616 apply #43fc000008000000 -> 1.00000000E+377 decd617 apply 1E+376 -> #43fc000001000000 Clamped decd618 apply #43fc000001000000 -> 1.0000000E+376 decd619 apply 1E+375 -> #43fc000000100000 Clamped decd620 apply #43fc000000100000 -> 1.000000E+375 decd621 apply 1E+374 -> #43fc000000020000 Clamped decd622 apply #43fc000000020000 -> 1.00000E+374 decd623 apply 1E+373 -> #43fc000000004000 Clamped decd624 apply #43fc000000004000 -> 1.0000E+373 decd625 apply 1E+372 -> #43fc000000000400 Clamped decd626 apply #43fc000000000400 -> 1.000E+372 decd627 apply 1E+371 -> #43fc000000000080 Clamped decd628 apply #43fc000000000080 -> 1.00E+371 decd629 apply 1E+370 -> #43fc000000000010 Clamped decd630 apply #43fc000000000010 -> 1.0E+370 decd631 apply 1E+369 -> #43fc000000000001 decd632 apply #43fc000000000001 -> 1E+369 decd633 apply 1E+368 -> #43f8000000000001 decd634 apply #43f8000000000001 -> 1E+368 -- same with 9s decd641 apply 9E+384 -> #77fc000000000000 Clamped decd642 apply #77fc000000000000 -> 9.000000000000000E+384 decd643 apply 9E+383 -> #43fc8c0000000000 Clamped decd644 apply #43fc8c0000000000 -> 9.00000000000000E+383 decd645 apply 9E+382 -> #43fc1a0000000000 Clamped decd646 apply #43fc1a0000000000 -> 9.0000000000000E+382 decd647 apply 9E+381 -> #43fc090000000000 Clamped decd648 apply #43fc090000000000 -> 9.000000000000E+381 decd649 apply 9E+380 -> #43fc002300000000 Clamped decd650 apply #43fc002300000000 -> 9.00000000000E+380 decd651 apply 9E+379 -> #43fc000680000000 Clamped decd652 apply #43fc000680000000 -> 9.0000000000E+379 decd653 apply 9E+378 -> #43fc000240000000 Clamped decd654 apply #43fc000240000000 -> 9.000000000E+378 decd655 apply 9E+377 -> #43fc000008c00000 Clamped decd656 apply #43fc000008c00000 -> 9.00000000E+377 decd657 apply 9E+376 -> #43fc000001a00000 Clamped decd658 apply #43fc000001a00000 -> 9.0000000E+376 decd659 apply 9E+375 -> #43fc000000900000 Clamped decd660 apply #43fc000000900000 -> 9.000000E+375 decd661 apply 9E+374 -> #43fc000000023000 Clamped decd662 apply #43fc000000023000 -> 9.00000E+374 decd663 apply 9E+373 -> #43fc000000006800 Clamped decd664 apply #43fc000000006800 -> 9.0000E+373 decd665 apply 9E+372 -> #43fc000000002400 Clamped decd666 apply #43fc000000002400 -> 9.000E+372 decd667 apply 9E+371 -> #43fc00000000008c Clamped decd668 apply #43fc00000000008c -> 9.00E+371 decd669 apply 9E+370 -> #43fc00000000001a Clamped decd670 apply #43fc00000000001a -> 9.0E+370 decd671 apply 9E+369 -> #43fc000000000009 decd672 apply #43fc000000000009 -> 9E+369 decd673 apply 9E+368 -> #43f8000000000009 decd674 apply #43f8000000000009 -> 9E+368 -- Selected DPD codes decd700 apply #2238000000000000 -> 0 decd701 apply #2238000000000009 -> 9 decd702 apply #2238000000000010 -> 10 decd703 apply #2238000000000019 -> 19 decd704 apply #2238000000000020 -> 20 decd705 apply #2238000000000029 -> 29 decd706 apply #2238000000000030 -> 30 decd707 apply #2238000000000039 -> 39 decd708 apply #2238000000000040 -> 40 decd709 apply #2238000000000049 -> 49 decd710 apply #2238000000000050 -> 50 decd711 apply #2238000000000059 -> 59 decd712 apply #2238000000000060 -> 60 decd713 apply #2238000000000069 -> 69 decd714 apply #2238000000000070 -> 70 decd715 apply #2238000000000071 -> 71 decd716 apply #2238000000000072 -> 72 decd717 apply #2238000000000073 -> 73 decd718 apply #2238000000000074 -> 74 decd719 apply #2238000000000075 -> 75 decd720 apply #2238000000000076 -> 76 decd721 apply #2238000000000077 -> 77 decd722 apply #2238000000000078 -> 78 decd723 apply #2238000000000079 -> 79 decd725 apply #223800000000029e -> 994 decd726 apply #223800000000029f -> 995 decd727 apply #22380000000002a0 -> 520 decd728 apply #22380000000002a1 -> 521 -- from telco test data decd730 apply #2238000000000188 -> 308 decd731 apply #22380000000001a3 -> 323 decd732 apply #223800000000002a -> 82 decd733 apply #22380000000001a9 -> 329 decd734 apply #2238000000000081 -> 101 decd735 apply #22380000000002a2 -> 522 -- DPD: one of each of the huffman groups decd740 apply #22380000000003f7 -> 777 decd741 apply #22380000000003f8 -> 778 decd742 apply #22380000000003eb -> 787 decd743 apply #223800000000037d -> 877 decd744 apply #223800000000039f -> 997 decd745 apply #22380000000003bf -> 979 decd746 apply #22380000000003df -> 799 decd747 apply #223800000000006e -> 888 -- DPD all-highs cases (includes the 24 redundant codes) decd750 apply #223800000000006e -> 888 decd751 apply #223800000000016e -> 888 decd752 apply #223800000000026e -> 888 decd753 apply #223800000000036e -> 888 decd754 apply #223800000000006f -> 889 decd755 apply #223800000000016f -> 889 decd756 apply #223800000000026f -> 889 decd757 apply #223800000000036f -> 889 decd760 apply #223800000000007e -> 898 decd761 apply #223800000000017e -> 898 decd762 apply #223800000000027e -> 898 decd763 apply #223800000000037e -> 898 decd764 apply #223800000000007f -> 899 decd765 apply #223800000000017f -> 899 decd766 apply #223800000000027f -> 899 decd767 apply #223800000000037f -> 899 decd770 apply #22380000000000ee -> 988 decd771 apply #22380000000001ee -> 988 decd772 apply #22380000000002ee -> 988 decd773 apply #22380000000003ee -> 988 decd774 apply #22380000000000ef -> 989 decd775 apply #22380000000001ef -> 989 decd776 apply #22380000000002ef -> 989 decd777 apply #22380000000003ef -> 989 decd780 apply #22380000000000fe -> 998 decd781 apply #22380000000001fe -> 998 decd782 apply #22380000000002fe -> 998 decd783 apply #22380000000003fe -> 998 decd784 apply #22380000000000ff -> 999 decd785 apply #22380000000001ff -> 999 decd786 apply #22380000000002ff -> 999 decd787 apply #22380000000003ff -> 999 -- values around [u]int32 edges (zeros done earlier) decd800 apply -2147483646 -> #a23800008c78af46 decd801 apply -2147483647 -> #a23800008c78af47 decd802 apply -2147483648 -> #a23800008c78af48 decd803 apply -2147483649 -> #a23800008c78af49 decd804 apply 2147483646 -> #223800008c78af46 decd805 apply 2147483647 -> #223800008c78af47 decd806 apply 2147483648 -> #223800008c78af48 decd807 apply 2147483649 -> #223800008c78af49 decd808 apply 4294967294 -> #2238000115afb55a decd809 apply 4294967295 -> #2238000115afb55b decd810 apply 4294967296 -> #2238000115afb57a decd811 apply 4294967297 -> #2238000115afb57b decd820 apply #a23800008c78af46 -> -2147483646 decd821 apply #a23800008c78af47 -> -2147483647 decd822 apply #a23800008c78af48 -> -2147483648 decd823 apply #a23800008c78af49 -> -2147483649 decd824 apply #223800008c78af46 -> 2147483646 decd825 apply #223800008c78af47 -> 2147483647 decd826 apply #223800008c78af48 -> 2147483648 decd827 apply #223800008c78af49 -> 2147483649 decd828 apply #2238000115afb55a -> 4294967294 decd829 apply #2238000115afb55b -> 4294967295 decd830 apply #2238000115afb57a -> 4294967296 decd831 apply #2238000115afb57b -> 4294967297 -- for narrowing decd840 apply #2870000000000000 -> 2.000000000000000E-99 -- some miscellaneous decd850 apply #0004070000000000 -> 7.000000000000E-385 Subnormal decd851 apply #0008000000020000 -> 1.00000E-391 Subnormal