add test for scientific notation

This commit is contained in:
v-kaywon 2017-11-17 10:21:03 -08:00
parent 4fb2c80e69
commit 90029e7e54
3 changed files with 826 additions and 17 deletions

View file

@ -531,7 +531,7 @@ void core_sqlsrv_bind_param( _Inout_ sqlsrv_stmt* stmt, _In_ SQLUSMALLINT param_
break;
case IS_STRING:
{
if( stmt->conn->ce_option.enabled && ( sql_type == SQL_DECIMAL || sql_type == SQL_NUMERIC )){
if ( sql_type == SQL_DECIMAL || sql_type == SQL_NUMERIC ) {
adjustInputPrecision( param_z, decimal_digits );
}
@ -2662,25 +2662,26 @@ bool reset_ae_stream_cursor( _Inout_ sqlsrv_stmt* stmt ) {
}
void adjustInputPrecision( _Inout_ zval* param_z, _In_ SQLSMALLINT decimal_digits ) {
// 38 is the maximum precision supported for sql decimal types
// 6 is a composition of: 1 for '.'; 1 for sign of the number;
// 1 for 'e' or 'E' (scientific notation); 1 for sign of scientific exponent; 2 for length of scientific exponent
size_t maxDecimalLen = 38 + 6;
SQLSRV_ASSERT( Z_STRLEN_P( param_z ) < maxDecimalLen, "Input decimal overflow: sql decimal type only supports up to a precision of 38." );
size_t maxDecimalPrecision = 38;
// maxDecimalStrLen is the maximum length of a stringified decimal number
// 6 is derived from: 1 for '.'; 1 for sign of the number; 1 for 'e' or 'E' (scientific notation);
// 1 for sign of scientific exponent; 2 for length of scientific exponent
size_t maxDecimalStrLen = maxDecimalPrecision + 6;
SQLSRV_ASSERT( Z_STRLEN_P( param_z ) < maxDecimalStrLen, "Input decimal overflow: sql decimal type only supports up to a precision of 38." );
std::vector<size_t> digits;
char* ptr = ZSTR_VAL( Z_STR_P( param_z ));
bool isNeg = false;
char scientificChar = ' ';
int scientificExp = 0;
short scientificExp = 0;
// parse digits in param_z into the vector digits
if( *ptr == '+' || *ptr == '-' ){
if( *ptr = '-' ){
if( *ptr == '-' ){
isNeg = true;
}
ptr++;
}
size_t numInt = 0;
size_t numDec = 0;
short numInt = 0;
short numDec = 0;
while( isdigit( *ptr )){
digits.push_back( *ptr - '0' );
ptr++;
@ -2707,28 +2708,28 @@ void adjustInputPrecision( _Inout_ zval* param_z, _In_ SQLSMALLINT decimal_digit
ptr++;
}
while( isdigit( *ptr )){
scientificExp = scientificExp * 10 + *ptr - '0';
scientificExp = scientificExp * 10 + ( *ptr - '0' );
ptr++;
}
SQLSRV_ASSERT( scientificExp <=38, "Input decimal overflow: sql decimal type only supports up to a precision of 38." );
SQLSRV_ASSERT( scientificExp <= maxDecimalPrecision, "Input decimal overflow: sql decimal type only supports up to a precision of 38." );
if( isNegExp ){
scientificExp = scientificExp * -1;
}
}
SQLSRV_ASSERT( *ptr == '\0', "Invalid input decimal: Invalid character found in the decimal string." );
// if number of decimal is less than the exponent, that means the number is a whole number, so no need to adjust the precision
if(( int )numDec > scientificExp ){
int decToRemove = numDec - scientificExp - decimal_digits;
if( numDec > scientificExp ){
short decToRemove = numDec - scientificExp - decimal_digits;
if( decToRemove > 0 ){
bool carryOver = false;
int backInd = 0;
short backInd = 0;
// pop digits from the vector until there is only 1 more decimal place than required decimal_digits
while( decToRemove != 1 && !digits.empty() ){
digits.pop_back();
decToRemove--;
}
if( !digits.empty() ){
// check if the last digit to be popped is greater than 5, if so, the digit before is needs to round up
// check if the last digit to be popped is greater than 5, if so, the digit before it needs to round up
carryOver = digits.back() >= 5;
digits.pop_back();
backInd = digits.size() - 1;
@ -2756,7 +2757,7 @@ void adjustInputPrecision( _Inout_ zval* param_z, _In_ SQLSMALLINT decimal_digit
oss << 0;
}
else{
int i = 0;
short i = 0;
for( i; i < numInt && i < digits.size(); i++ ){
oss << digits[i];
}

View file

@ -0,0 +1,405 @@
--TEST--
Test for inserting into and retrieving from decimal columns of different scale
--SKIPIF--
<?php require('skipif_mid-refactor.inc'); ?>
--FILE--
<?php
require_once("MsCommon_mid-refactor.inc");
$posExp = array(-0.00e+01, 10.0E+00, -1.333e+1, 1.9178464696202265E+2, -8.3333e+2, 8.5000000000000006E+2, -8.5164835164835168E+2, 3.16E+05, -5E+05, 1.53502e+006, -7.5013e+006, 7.54001e+006, -7.54045e+006, 820.0E+10, -1.12255E+7, 1.23456789E+9, -1.23456789012346E+7, 1.377532E+10);
$negExp = array(0.00e-01, -10.0E-00, 1.333e-1, -1.9178464696202265E-2, 8.3333e-2, -8.5000000000000006E-2, 8.5164835164835168E-2, -3.16E-01, 5E-03, -1.53502e-004, 7.5013e-004, -7.54001e-004, 7.54045e-004, -820.0E-1, 1.12255E-4, -1.23456789E-3, 1.23456789012346E-4, -1.377532E-1);
$numSets = array("Testing numbers greater than 1:" => $posExp,
"Testing numbers greater than 0 and less than 1:" => $negExp);
$scalesToTest = array(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 19);
try {
$conn = connect();
$tbname = "decimalTable";
foreach ($numSets as $testName => $numSet) {
echo "\n$testName\n";
foreach ($numSet as $input) {
$numInt = ceil(log10(abs($input) + 1));
$decimalTypes = array();
foreach ($scalesToTest as $scale) {
if ($scale < 39 - $numInt) {
$decimalTypes = array_merge($decimalTypes, array("c$scale" => "decimal(38, $scale)"));
}
}
if (empty($decimalTypes)) {
$decimalTypes = array("c0" => "decimal(38, 0)");
}
createTable($conn, $tbname, $decimalTypes);
$insertValues = array();
foreach ($decimalTypes as $key => $value) {
if (isColEncrypted()) {
$insertValues = array_merge($insertValues, array($key => strval($input)));
} else {
$insertValues = array_merge($insertValues, array($key => $input));
}
}
insertRow($conn, $tbname, $insertValues, "prepareBindParam");
$stmt = $conn->query("SELECT * FROM $tbname");
$row = $stmt->fetch(PDO::FETCH_ASSOC);
foreach ($row as $key => $value) {
if ($value != 0) {
echo "$key: $value\n";
}
}
$conn->exec("TRUNCATE TABLE $tbname");
}
}
dropTable($conn, $tbname);
unset($conn);
} catch (PDOException $e) {
echo $e->getMessage();
}
?>
--EXPECT--
Testing numbers greater than 1:
c0: 10
c1: 10.0
c2: 10.00
c3: 10.000
c4: 10.0000
c5: 10.00000
c6: 10.000000
c7: 10.0000000
c8: 10.00000000
c9: 10.000000000
c19: 10.0000000000000000000
c0: -13
c1: -13.3
c2: -13.33
c3: -13.330
c4: -13.3300
c5: -13.33000
c6: -13.330000
c7: -13.3300000
c8: -13.33000000
c9: -13.330000000
c19: -13.3300000000000000000
c0: 192
c1: 191.8
c2: 191.78
c3: 191.785
c4: 191.7846
c5: 191.78465
c6: 191.784647
c7: 191.7846470
c8: 191.78464696
c9: 191.784646962
c19: 191.7846469620200000000
c0: -833
c1: -833.3
c2: -833.33
c3: -833.330
c4: -833.3300
c5: -833.33000
c6: -833.330000
c7: -833.3300000
c8: -833.33000000
c9: -833.330000000
c19: -833.3300000000000000000
c0: 850
c1: 850.0
c2: 850.00
c3: 850.000
c4: 850.0000
c5: 850.00000
c6: 850.000000
c7: 850.0000000
c8: 850.00000000
c9: 850.000000000
c19: 850.0000000000000000000
c0: -852
c1: -851.6
c2: -851.65
c3: -851.648
c4: -851.6484
c5: -851.64835
c6: -851.648352
c7: -851.6483516
c8: -851.64835165
c9: -851.648351648
c19: -851.6483516483500000000
c0: 316000
c1: 316000.0
c2: 316000.00
c3: 316000.000
c4: 316000.0000
c5: 316000.00000
c6: 316000.000000
c7: 316000.0000000
c8: 316000.00000000
c9: 316000.000000000
c19: 316000.0000000000000000000
c0: -500000
c1: -500000.0
c2: -500000.00
c3: -500000.000
c4: -500000.0000
c5: -500000.00000
c6: -500000.000000
c7: -500000.0000000
c8: -500000.00000000
c9: -500000.000000000
c19: -500000.0000000000000000000
c0: 1535020
c1: 1535020.0
c2: 1535020.00
c3: 1535020.000
c4: 1535020.0000
c5: 1535020.00000
c6: 1535020.000000
c7: 1535020.0000000
c8: 1535020.00000000
c9: 1535020.000000000
c19: 1535020.0000000000000000000
c0: -7501300
c1: -7501300.0
c2: -7501300.00
c3: -7501300.000
c4: -7501300.0000
c5: -7501300.00000
c6: -7501300.000000
c7: -7501300.0000000
c8: -7501300.00000000
c9: -7501300.000000000
c19: -7501300.0000000000000000000
c0: 7540010
c1: 7540010.0
c2: 7540010.00
c3: 7540010.000
c4: 7540010.0000
c5: 7540010.00000
c6: 7540010.000000
c7: 7540010.0000000
c8: 7540010.00000000
c9: 7540010.000000000
c19: 7540010.0000000000000000000
c0: -7540450
c1: -7540450.0
c2: -7540450.00
c3: -7540450.000
c4: -7540450.0000
c5: -7540450.00000
c6: -7540450.000000
c7: -7540450.0000000
c8: -7540450.00000000
c9: -7540450.000000000
c19: -7540450.0000000000000000000
c0: 8200000000000
c1: 8200000000000.0
c2: 8200000000000.00
c3: 8200000000000.000
c4: 8200000000000.0000
c5: 8200000000000.00000
c6: 8200000000000.000000
c7: 8200000000000.0000000
c8: 8200000000000.00000000
c9: 8200000000000.000000000
c19: 8200000000000.0000000000000000000
c0: -11225500
c1: -11225500.0
c2: -11225500.00
c3: -11225500.000
c4: -11225500.0000
c5: -11225500.00000
c6: -11225500.000000
c7: -11225500.0000000
c8: -11225500.00000000
c9: -11225500.000000000
c19: -11225500.0000000000000000000
c0: 1234567890
c1: 1234567890.0
c2: 1234567890.00
c3: 1234567890.000
c4: 1234567890.0000
c5: 1234567890.00000
c6: 1234567890.000000
c7: 1234567890.0000000
c8: 1234567890.00000000
c9: 1234567890.000000000
c19: 1234567890.0000000000000000000
c0: -12345679
c1: -12345678.9
c2: -12345678.90
c3: -12345678.901
c4: -12345678.9012
c5: -12345678.90124
c6: -12345678.901235
c7: -12345678.9012350
c8: -12345678.90123500
c9: -12345678.901235000
c19: -12345678.9012350000000000000
c0: 13775320000
c1: 13775320000.0
c2: 13775320000.00
c3: 13775320000.000
c4: 13775320000.0000
c5: 13775320000.00000
c6: 13775320000.000000
c7: 13775320000.0000000
c8: 13775320000.00000000
c9: 13775320000.000000000
c19: 13775320000.0000000000000000000
Testing numbers greater than 0 and less than 1:
c0: -10
c1: -10.0
c2: -10.00
c3: -10.000
c4: -10.0000
c5: -10.00000
c6: -10.000000
c7: -10.0000000
c8: -10.00000000
c9: -10.000000000
c19: -10.0000000000000000000
c1: .1
c2: .13
c3: .133
c4: .1333
c5: .13330
c6: .133300
c7: .1333000
c8: .13330000
c9: .133300000
c19: .1333000000000000000
c2: -.02
c3: -.019
c4: -.0192
c5: -.01918
c6: -.019178
c7: -.0191785
c8: -.01917846
c9: -.019178465
c19: -.0191784646962020000
c1: .1
c2: .08
c3: .083
c4: .0833
c5: .08333
c6: .083333
c7: .0833330
c8: .08333300
c9: .083333000
c19: .0833330000000000000
c1: -.1
c2: -.09
c3: -.085
c4: -.0850
c5: -.08500
c6: -.085000
c7: -.0850000
c8: -.08500000
c9: -.085000000
c19: -.0850000000000000000
c1: .1
c2: .09
c3: .085
c4: .0852
c5: .08516
c6: .085165
c7: .0851648
c8: .08516484
c9: .085164835
c19: .0851648351648350000
c1: -.3
c2: -.32
c3: -.316
c4: -.3160
c5: -.31600
c6: -.316000
c7: -.3160000
c8: -.31600000
c9: -.316000000
c19: -.3160000000000000000
c2: .01
c3: .005
c4: .0050
c5: .00500
c6: .005000
c7: .0050000
c8: .00500000
c9: .005000000
c19: .0050000000000000000
c4: -.0002
c5: -.00015
c6: -.000154
c7: -.0001535
c8: -.00015350
c9: -.000153502
c19: -.0001535020000000000
c3: .001
c4: .0008
c5: .00075
c6: .000750
c7: .0007501
c8: .00075013
c9: .000750130
c19: .0007501300000000000
c3: -.001
c4: -.0008
c5: -.00075
c6: -.000754
c7: -.0007540
c8: -.00075400
c9: -.000754001
c19: -.0007540010000000000
c3: .001
c4: .0008
c5: .00075
c6: .000754
c7: .0007540
c8: .00075405
c9: .000754045
c19: .0007540450000000000
c0: -82
c1: -82.0
c2: -82.00
c3: -82.000
c4: -82.0000
c5: -82.00000
c6: -82.000000
c7: -82.0000000
c8: -82.00000000
c9: -82.000000000
c19: -82.0000000000000000000
c4: .0001
c5: .00011
c6: .000112
c7: .0001123
c8: .00011226
c9: .000112255
c19: .0001122550000000000
c3: -.001
c4: -.0012
c5: -.00123
c6: -.001235
c7: -.0012346
c8: -.00123457
c9: -.001234568
c19: -.0012345678900000000
c4: .0001
c5: .00012
c6: .000123
c7: .0001235
c8: .00012346
c9: .000123457
c19: .0001234567890123500
c1: -.1
c2: -.14
c3: -.138
c4: -.1378
c5: -.13775
c6: -.137753
c7: -.1377532
c8: -.13775320
c9: -.137753200
c19: -.1377532000000000000

View file

@ -0,0 +1,403 @@
--TEST--
Test for inserting into and retrieving from decimal columns of different scale
--SKIPIF--
<?php require('skipif_versions_old.inc'); ?>
--FILE--
<?php
require_once('MsHelper.inc');
$posExp = array("-0.00e+01", "10.0E+00", "-1.333e+1", "1.9178464696202265E+2", "-8.3333e+2", "8.5000000000000006E+2", "-8.5164835164835168E+2", "3.16E+05", "-5E+05", "1.53502e+006", "-7.5013e+006", "7.54001e+006", "-7.54045e+006", "820.0E+10", "-1.12255E+7", "1.23456789E+9", "-1.23456789012346E+7", "1.377532E+10");
$negExp = array("0.00e-01", "-10.0E-00", "1.333e-1", "-1.9178464696202265E-2", "8.3333e-2", "-8.5000000000000006E-2", "8.5164835164835168E-2", "-3.16E-01", "5E-03", "-1.53502e-004", "7.5013e-004", "-7.54001e-004", "7.54045e-004", "-820.0E-1", "1.12255E-4", "-1.23456789E-3", "1.23456789012346E-4", "-1.377532E-1");
$numSets = array("Testing numbers greater than 1:" => $posExp,
"Testing numbers greater than 0 and less than 1:" => $negExp);
$scalesToTest = array(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 19);
try {
$conn = AE\connect();
$tbname = "decimalTable";
foreach ($numSets as $testName => $numSet) {
echo "\n$testName\n";
foreach ($numSet as $input) {
$numInt = ceil(log10(abs($input) + 1));
$decimalTypes = array();
foreach ($scalesToTest as $scale) {
if ($scale < 39 - $numInt) {
array_push($decimalTypes, new AE\ColumnMeta("decimal(38, $scale)", "c$scale"));
}
}
if (empty($decimalTypes)) {
$decimalTypes = array(new AE\ColumnMeta("decimal(38, 0)", "c0"));
}
AE\createTable($conn, $tbname, $decimalTypes);
$insertValues = array();
foreach ($decimalTypes as $decimalType) {
$scale = intval(ltrim($decimalType->colName, "c"));
array_push($insertValues, array($input, SQLSRV_PARAM_IN, SQLSRV_PHPTYPE_STRING(SQLSRV_ENC_CHAR), SQLSRV_SQLTYPE_DECIMAL(38, $scale)));
}
$insertSql = "INSERT INTO $tbname VALUES(" . AE\getSeqPlaceholders(count($insertValues)) . ")";
$stmt = sqlsrv_prepare($conn, $insertSql, $insertValues);
sqlsrv_execute($stmt);
$stmt = sqlsrv_query($conn, "SELECT * FROM $tbname");
$row = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC);
foreach ($row as $key => $value) {
if ($value != 0) {
echo "$key: $value\n";
}
}
sqlsrv_query($conn, "TRUNCATE TABLE $tbname");
}
}
dropTable($conn, $tbname);
sqlsrv_close($conn);
} catch (PDOException $e) {
echo $e->getMessage();
}
?>
--EXPECT--
Testing numbers greater than 1:
c0: 10
c1: 10.0
c2: 10.00
c3: 10.000
c4: 10.0000
c5: 10.00000
c6: 10.000000
c7: 10.0000000
c8: 10.00000000
c9: 10.000000000
c19: 10.0000000000000000000
c0: -13
c1: -13.3
c2: -13.33
c3: -13.330
c4: -13.3300
c5: -13.33000
c6: -13.330000
c7: -13.3300000
c8: -13.33000000
c9: -13.330000000
c19: -13.3300000000000000000
c0: 192
c1: 191.8
c2: 191.78
c3: 191.785
c4: 191.7846
c5: 191.78465
c6: 191.784647
c7: 191.7846470
c8: 191.78464696
c9: 191.784646962
c19: 191.7846469620226500000
c0: -833
c1: -833.3
c2: -833.33
c3: -833.330
c4: -833.3300
c5: -833.33000
c6: -833.330000
c7: -833.3300000
c8: -833.33000000
c9: -833.330000000
c19: -833.3300000000000000000
c0: 850
c1: 850.0
c2: 850.00
c3: 850.000
c4: 850.0000
c5: 850.00000
c6: 850.000000
c7: 850.0000000
c8: 850.00000000
c9: 850.000000000
c19: 850.0000000000000600000
c0: -852
c1: -851.6
c2: -851.65
c3: -851.648
c4: -851.6484
c5: -851.64835
c6: -851.648352
c7: -851.6483516
c8: -851.64835165
c9: -851.648351648
c19: -851.6483516483516800000
c0: 316000
c1: 316000.0
c2: 316000.00
c3: 316000.000
c4: 316000.0000
c5: 316000.00000
c6: 316000.000000
c7: 316000.0000000
c8: 316000.00000000
c9: 316000.000000000
c19: 316000.0000000000000000000
c0: -500000
c1: -500000.0
c2: -500000.00
c3: -500000.000
c4: -500000.0000
c5: -500000.00000
c6: -500000.000000
c7: -500000.0000000
c8: -500000.00000000
c9: -500000.000000000
c19: -500000.0000000000000000000
c0: 1535020
c1: 1535020.0
c2: 1535020.00
c3: 1535020.000
c4: 1535020.0000
c5: 1535020.00000
c6: 1535020.000000
c7: 1535020.0000000
c8: 1535020.00000000
c9: 1535020.000000000
c19: 1535020.0000000000000000000
c0: -7501300
c1: -7501300.0
c2: -7501300.00
c3: -7501300.000
c4: -7501300.0000
c5: -7501300.00000
c6: -7501300.000000
c7: -7501300.0000000
c8: -7501300.00000000
c9: -7501300.000000000
c19: -7501300.0000000000000000000
c0: 7540010
c1: 7540010.0
c2: 7540010.00
c3: 7540010.000
c4: 7540010.0000
c5: 7540010.00000
c6: 7540010.000000
c7: 7540010.0000000
c8: 7540010.00000000
c9: 7540010.000000000
c19: 7540010.0000000000000000000
c0: -7540450
c1: -7540450.0
c2: -7540450.00
c3: -7540450.000
c4: -7540450.0000
c5: -7540450.00000
c6: -7540450.000000
c7: -7540450.0000000
c8: -7540450.00000000
c9: -7540450.000000000
c19: -7540450.0000000000000000000
c0: 8200000000000
c1: 8200000000000.0
c2: 8200000000000.00
c3: 8200000000000.000
c4: 8200000000000.0000
c5: 8200000000000.00000
c6: 8200000000000.000000
c7: 8200000000000.0000000
c8: 8200000000000.00000000
c9: 8200000000000.000000000
c19: 8200000000000.0000000000000000000
c0: -11225500
c1: -11225500.0
c2: -11225500.00
c3: -11225500.000
c4: -11225500.0000
c5: -11225500.00000
c6: -11225500.000000
c7: -11225500.0000000
c8: -11225500.00000000
c9: -11225500.000000000
c19: -11225500.0000000000000000000
c0: 1234567890
c1: 1234567890.0
c2: 1234567890.00
c3: 1234567890.000
c4: 1234567890.0000
c5: 1234567890.00000
c6: 1234567890.000000
c7: 1234567890.0000000
c8: 1234567890.00000000
c9: 1234567890.000000000
c19: 1234567890.0000000000000000000
c0: -12345679
c1: -12345678.9
c2: -12345678.90
c3: -12345678.901
c4: -12345678.9012
c5: -12345678.90123
c6: -12345678.901235
c7: -12345678.9012346
c8: -12345678.90123460
c9: -12345678.901234600
c19: -12345678.9012346000000000000
c0: 13775320000
c1: 13775320000.0
c2: 13775320000.00
c3: 13775320000.000
c4: 13775320000.0000
c5: 13775320000.00000
c6: 13775320000.000000
c7: 13775320000.0000000
c8: 13775320000.00000000
c9: 13775320000.000000000
c19: 13775320000.0000000000000000000
Testing numbers greater than 0 and less than 1:
c0: -10
c1: -10.0
c2: -10.00
c3: -10.000
c4: -10.0000
c5: -10.00000
c6: -10.000000
c7: -10.0000000
c8: -10.00000000
c9: -10.000000000
c19: -10.0000000000000000000
c1: .1
c2: .13
c3: .133
c4: .1333
c5: .13330
c6: .133300
c7: .1333000
c8: .13330000
c9: .133300000
c19: .1333000000000000000
c2: -.02
c3: -.019
c4: -.0192
c5: -.01918
c6: -.019178
c7: -.0191785
c8: -.01917846
c9: -.019178465
c19: -.0191784646962022650
c1: .1
c2: .08
c3: .083
c4: .0833
c5: .08333
c6: .083333
c7: .0833330
c8: .08333300
c9: .083333000
c19: .0833330000000000000
c1: -.1
c2: -.09
c3: -.085
c4: -.0850
c5: -.08500
c6: -.085000
c7: -.0850000
c8: -.08500000
c9: -.085000000
c19: -.0850000000000000060
c1: .1
c2: .09
c3: .085
c4: .0852
c5: .08516
c6: .085165
c7: .0851648
c8: .08516484
c9: .085164835
c19: .0851648351648351680
c1: -.3
c2: -.32
c3: -.316
c4: -.3160
c5: -.31600
c6: -.316000
c7: -.3160000
c8: -.31600000
c9: -.316000000
c19: -.3160000000000000000
c2: .01
c3: .005
c4: .0050
c5: .00500
c6: .005000
c7: .0050000
c8: .00500000
c9: .005000000
c19: .0050000000000000000
c4: -.0002
c5: -.00015
c6: -.000154
c7: -.0001535
c8: -.00015350
c9: -.000153502
c19: -.0001535020000000000
c3: .001
c4: .0008
c5: .00075
c6: .000750
c7: .0007501
c8: .00075013
c9: .000750130
c19: .0007501300000000000
c3: -.001
c4: -.0008
c5: -.00075
c6: -.000754
c7: -.0007540
c8: -.00075400
c9: -.000754001
c19: -.0007540010000000000
c3: .001
c4: .0008
c5: .00075
c6: .000754
c7: .0007540
c8: .00075405
c9: .000754045
c19: .0007540450000000000
c0: -82
c1: -82.0
c2: -82.00
c3: -82.000
c4: -82.0000
c5: -82.00000
c6: -82.000000
c7: -82.0000000
c8: -82.00000000
c9: -82.000000000
c19: -82.0000000000000000000
c4: .0001
c5: .00011
c6: .000112
c7: .0001123
c8: .00011226
c9: .000112255
c19: .0001122550000000000
c3: -.001
c4: -.0012
c5: -.00123
c6: -.001235
c7: -.0012346
c8: -.00123457
c9: -.001234568
c19: -.0012345678900000000
c4: .0001
c5: .00012
c6: .000123
c7: .0001235
c8: .00012346
c9: .000123457
c19: .0001234567890123460
c1: -.1
c2: -.14
c3: -.138
c4: -.1378
c5: -.13775
c6: -.137753
c7: -.1377532
c8: -.13775320
c9: -.137753200
c19: -.1377532000000000000