blob: 45eb4f61663d01da31ef882503743d21fda55e19 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "big_decimal.h"
#include "big_integer.h"
#include <gtest/gtest.h>
using namespace ignite;
template<typename T>
void CheckOutputSimple(int64_t val) {
T dec(val);
std::stringstream ss1;
std::stringstream ss2;
ss1 << val;
ss2 << dec;
EXPECT_EQ(ss1.str(), ss2.str());
}
template<typename T>
void CheckInputOutput(const std::string &val) {
T dec;
std::string res;
std::stringstream ss1;
ss1 << val;
ss1 >> dec;
std::stringstream ss2;
ss2 << dec;
res = ss2.str();
EXPECT_EQ(val, res);
}
template<typename T>
void CheckOutputInput(const T &val) {
T dec;
std::stringstream ss;
ss << val;
ss >> dec;
EXPECT_EQ(val, dec);
}
void CheckDoubleCast(double val) {
big_decimal dec1(big_decimal::from_double(val));
big_decimal dec2;
dec2.assign_double(val);
EXPECT_NEAR(val, dec1.to_double(), 1E-10);
EXPECT_NEAR(val, dec2.to_double(), 1E-10);
}
TEST(bignum, TestMultiplyBigIntegerArguments) {
big_integer big_int(12345);
{
const big_integer::mag_array_view mag = big_int.get_magnitude();
EXPECT_GE(mag.size_words(), 1);
EXPECT_GE(mag.size_bytes(), 4);
EXPECT_EQ(mag.size_bytes_non_zero(), 2);
}
big_integer res;
// 152399025
big_int.multiply(big_integer(12345), res);
{
const big_integer::mag_array_view mag = res.get_magnitude();
EXPECT_EQ(mag.size_bytes_non_zero(), 4);
EXPECT_EQ(mag[0], 152399025UL);
}
// 152399025
big_int.assign_int64(12345);
big_int.multiply(big_int, res);
{
const big_integer::mag_array_view mag = res.get_magnitude();
EXPECT_EQ(mag.size_bytes_non_zero(), 4);
EXPECT_EQ(mag[0], 152399025UL);
}
// 152399025
big_int.assign_int64(12345);
big_int.multiply(big_integer(12345), big_int);
{
const big_integer::mag_array_view mag = big_int.get_magnitude();
EXPECT_EQ(mag.size_bytes_non_zero(), 4);
EXPECT_EQ(mag[0], 152399025UL);
}
// 152399025
big_int.assign_int64(12345);
big_int.multiply(big_int, big_int);
{
const big_integer::mag_array_view mag = big_int.get_magnitude();
EXPECT_EQ(mag.size_bytes_non_zero(), 4);
EXPECT_EQ(mag[0], 152399025UL);
}
}
TEST(bignum, TestMultiplyBigIntegerBigger) {
big_integer big_int(12345);
// 152399025
big_int.multiply(big_int, big_int);
// 3539537889086624823140625
// 0002 ED86 BBC3 30D1 DDC6 6111
big_integer buf = big_int;
big_int.multiply(buf, big_int);
big_int.multiply(buf, big_int);
{
const big_integer::mag_array_view mag = big_int.get_magnitude();
EXPECT_GE(mag.size_words(), 3);
EXPECT_GE(mag.size_bytes(), 12);
EXPECT_EQ(mag.size_bytes_non_zero(), 11);
EXPECT_EQ(mag[0], 0xDDC66111);
EXPECT_EQ(mag[1], 0xBBC330D1);
EXPECT_EQ(mag[2], 0x0002ED86);
}
// 2698355789040138398691723863616167551412718750 ==
// 0078 FF9A F760 4E12 4A1F 3179 D038 D455 630F CC9E
big_int.multiply(big_integer(32546826734), big_int);
big_int.multiply(big_integer(23423079641), big_int);
{
const big_integer::mag_array_view mag = big_int.get_magnitude();
EXPECT_GE(mag.size_words(), 5);
EXPECT_GE(mag.size_bytes(), 20);
EXPECT_EQ(mag.size_bytes_non_zero(), 19);
EXPECT_EQ(mag[0], 0x630FCC9E);
EXPECT_EQ(mag[1], 0xD038D455);
EXPECT_EQ(mag[2], 0x4A1F3179);
EXPECT_EQ(mag[3], 0xF7604E12);
EXPECT_EQ(mag[4], 0x0078FF9A);
}
}
TEST(bignum, TestPowBigInteger) {
big_integer big_int(12345);
{
const big_integer::mag_array_view mag = big_int.get_magnitude();
EXPECT_GE(mag.size_words(), 1);
EXPECT_GE(mag.size_bytes(), 4);
EXPECT_EQ(mag.size_bytes_non_zero(), 2);
EXPECT_EQ(mag[0], 12345);
}
// 152399025
big_int.pow(2);
{
const big_integer::mag_array_view mag = big_int.get_magnitude();
EXPECT_GE(mag.size_words(), 1);
EXPECT_GE(mag.size_bytes(), 4);
EXPECT_EQ(mag.size_bytes_non_zero(), 4);
EXPECT_EQ(mag[0], 152399025UL);
}
// 3539537889086624823140625
// 0002 ED86 BBC3 30D1 DDC6 6111
big_int.pow(3);
{
const big_integer::mag_array_view mag = big_int.get_magnitude();
EXPECT_GE(mag.size_words(), 3);
EXPECT_GE(mag.size_bytes(), 12);
EXPECT_EQ(mag.size_bytes_non_zero(), 11);
EXPECT_EQ(mag[0], 0xDDC66111);
EXPECT_EQ(mag[1], 0xBBC330D1);
EXPECT_EQ(mag[2], 0x0002ED86);
}
// 3086495556566025694024226933269611093366465997140345415945924110519533775
// 2241867322136254278528975546698722592953892009291022792452635153187272387
// 9105398830363346664660724134489229239181447334384883937966927158758068117
// 094808258116245269775390625
//
// 0000 B4D0 1355 772E
// C174 C5F3 B840 74ED 6A54 B544 48E1 E308 6A80 6050 7D37 A56F
// 54E6 FF91 13FF 7B0A 455C F649 F4CD 37D0 C5B0 0507 1BFD 9083
// 8F13 08B4 D962 08FC FBC0 B5AB F9F9 06C9 94B3 9715 8C43 C94F
// 4891 09E5 57AA 66C9 A4F4 3494 A938 89FE 87AF 9056 7D90 17A1
big_int.pow(10);
{
const big_integer::mag_array_view &mag = big_int.get_magnitude();
EXPECT_EQ(mag.size_words(), 26);
EXPECT_EQ(mag.size_bytes(), 104);
EXPECT_EQ(mag.size_bytes_non_zero(), 102);
EXPECT_EQ(mag[0], 0x7D9017A1);
EXPECT_EQ(mag[1], 0x87AF9056);
EXPECT_EQ(mag[2], 0xA93889FE);
EXPECT_EQ(mag[3], 0xA4F43494);
EXPECT_EQ(mag[4], 0x57AA66C9);
EXPECT_EQ(mag[5], 0x489109E5);
EXPECT_EQ(mag[6], 0x8C43C94F);
EXPECT_EQ(mag[7], 0x94B39715);
EXPECT_EQ(mag[8], 0xF9F906C9);
EXPECT_EQ(mag[9], 0xFBC0B5AB);
EXPECT_EQ(mag[10], 0xD96208FC);
EXPECT_EQ(mag[11], 0x8F1308B4);
EXPECT_EQ(mag[12], 0x1BFD9083);
EXPECT_EQ(mag[13], 0xC5B00507);
EXPECT_EQ(mag[14], 0xF4CD37D0);
EXPECT_EQ(mag[15], 0x455CF649);
EXPECT_EQ(mag[16], 0x13FF7B0A);
EXPECT_EQ(mag[17], 0x54E6FF91);
EXPECT_EQ(mag[18], 0x7D37A56F);
EXPECT_EQ(mag[19], 0x6A806050);
EXPECT_EQ(mag[20], 0x48E1E308);
EXPECT_EQ(mag[21], 0x6A54B544);
EXPECT_EQ(mag[22], 0xB84074ED);
EXPECT_EQ(mag[23], 0xC174C5F3);
EXPECT_EQ(mag[24], 0x1355772E);
EXPECT_EQ(mag[25], 0x0000B4D0);
}
big_int.assign_int64(-1);
big_int.pow(57298735);
EXPECT_EQ(big_int.to_int64(), -1);
big_int.pow(325347312);
EXPECT_EQ(big_int.to_int64(), 1);
big_int.assign_int64(2);
big_int.pow(10);
EXPECT_EQ(big_int.to_int64(), 1024);
big_int.assign_int64(-2);
big_int.pow(10);
EXPECT_EQ(big_int.to_int64(), 1024);
big_int.assign_int64(2);
big_int.pow(11);
EXPECT_EQ(big_int.to_int64(), 2048);
big_int.assign_int64(-2);
big_int.pow(11);
EXPECT_EQ(big_int.to_int64(), -2048);
}
TEST(bignum, TestMultiplyDivideSimple) {
big_integer val;
big_integer res;
big_integer rem;
val.assign_int64(23225462820950625L);
// 23225462820 and 950625
big_integer bi1;
big_integer bi2;
val.divide(big_integer(1000000), bi1, bi2);
// 23225 and 462820
big_integer bi3;
big_integer bi4;
bi1.divide(big_integer(1000000), bi3, bi4);
EXPECT_EQ(bi2.to_int64(), 950625L);
EXPECT_EQ(bi3.to_int64(), 23225L);
EXPECT_EQ(bi4.to_int64(), 462820L);
big_integer(0).divide(big_integer(1), res, rem);
EXPECT_EQ(res, big_integer(0));
EXPECT_EQ(rem, big_integer(0));
big_integer(0).divide(big_integer(100), res, rem);
EXPECT_EQ(res, big_integer(0));
EXPECT_EQ(rem, big_integer(0));
big_integer(0).divide(big_integer(-1), res, rem);
EXPECT_EQ(res, big_integer(0));
EXPECT_EQ(rem, big_integer(0));
big_integer(0).divide(big_integer(-100), res, rem);
EXPECT_EQ(res, big_integer(0));
EXPECT_EQ(rem, big_integer(0));
big_integer(1).divide(big_integer(1), res, rem);
EXPECT_EQ(res, big_integer(1));
EXPECT_EQ(rem, big_integer(0));
big_integer(10).divide(big_integer(1), res, rem);
EXPECT_EQ(res, big_integer(10));
EXPECT_EQ(rem, big_integer(0));
big_integer(-1).divide(big_integer(1), res, rem);
EXPECT_EQ(res, big_integer(-1));
EXPECT_EQ(rem, big_integer(0));
big_integer(-10).divide(big_integer(1), res, rem);
EXPECT_EQ(res, big_integer(-10));
EXPECT_EQ(rem, big_integer(0));
big_integer(1).divide(big_integer(-1), res, rem);
EXPECT_EQ(res, big_integer(-1));
EXPECT_EQ(rem, big_integer(0));
big_integer(10).divide(big_integer(-1), res, rem);
EXPECT_EQ(res, big_integer(-10));
EXPECT_EQ(rem, big_integer(0));
big_integer(-1).divide(big_integer(-1), res, rem);
EXPECT_EQ(res, big_integer(1));
EXPECT_EQ(rem, big_integer(0));
big_integer(-10).divide(big_integer(-1), res, rem);
EXPECT_EQ(res, big_integer(10));
EXPECT_EQ(rem, big_integer(0));
big_integer(123456789).divide(big_integer(1000), res);
EXPECT_EQ(res, big_integer(123456));
val.assign_int64(79823695862);
val.divide(val, res);
EXPECT_EQ(res, big_integer(1));
val.assign_int64(28658345673);
val.divide(val, val);
EXPECT_EQ(val, big_integer(1));
val.assign_int64(-97598673406);
val.divide(val, res, val);
EXPECT_EQ(res, big_integer(1));
EXPECT_EQ(val, big_integer(0));
val.assign_int64(1);
val.divide(val, res, val);
EXPECT_EQ(res, big_integer(1));
EXPECT_EQ(val, big_integer(0));
}
TEST(bignum, TestAddSimple) {
big_integer val;
big_integer res;
val.assign_int64(0);
EXPECT_EQ(val.to_int64(), 0L);
val.add(big_integer(1), res);
EXPECT_EQ(res.to_int64(), 1L);
// random
val.assign_int64(2463541195749558141L);
val.add(big_integer(3098194482677853036L), res);
EXPECT_EQ(res.to_int64(), 5561735678427411177L);
val.assign_int64(0);
val.add(big_integer(-1), res);
EXPECT_EQ(res.to_int64(), -1L);
// random negative
val.assign_int64(-4032357373991925161L);
val.add(big_integer(-233378388862503951L), res);
EXPECT_EQ(res.to_int64(), -4265735762854429112L);
}
TEST(bignum, TestSubtractSimple) {
big_integer val;
big_integer res;
val.assign_int64(0);
val.subtract(big_integer(1), res);
EXPECT_EQ(res.to_int64(), -1L);
// random
val.assign_int64(5688815843208686889L);
val.subtract(big_integer(3900474041211631169L), res);
EXPECT_EQ(res.to_int64(), 1788341801997055720L);
val.assign_int64(0);
val.add(big_integer(-1), res);
EXPECT_EQ(res.to_int64(), -1L);
// random negative
val.assign_int64(-3456647618045976636L);
val.add(big_integer(-4426861903511900512L), res);
EXPECT_EQ(res.to_int64(), -7883509521557877148L);
}
TEST(bignum, TestDivideBigger) {
big_integer res;
big_integer rem;
big_integer("4790467782742318458842833081").divide(big_integer(1000000000000000000L), res, rem);
EXPECT_EQ(res.to_int64(), 4790467782L);
EXPECT_EQ(rem.to_int64(), 742318458842833081L);
big_integer("4790467782742318458842833081").divide(big_integer("10000000000000000000"), res, rem);
EXPECT_EQ(res.to_int64(), 479046778L);
EXPECT_EQ(rem.to_int64(), 2742318458842833081L);
big_integer(
"328569986734256745892025106351608546013457217305539845689265945043650274304152384502658961485730864386")
.divide(big_integer("759823640567289574925305534862590863490856903465"), res, rem);
EXPECT_EQ(res, big_integer("432429275942170114314334535709873138296890293268042448"));
EXPECT_EQ(rem, big_integer("725289323707320757244048053769339286218272582066"));
big_integer("5789420569340865906230645903456092386459628364580763804659834658960883465807263084659832648768603645")
.divide(big_integer("-29064503640646565660609983646665763458768340596340586"), res, rem);
EXPECT_EQ(res, big_integer("-199192136253942064949205579447876757418653967046"));
EXPECT_EQ(rem, big_integer("9693519879390725820633207073869515731754969332274689"));
big_integer(
"-107519074510758034695616045096493659264398569023607895679428769875976987594876903458769799098378994985"
"793874569869348579")
.divide(
big_integer("197290846190263940610876503491586943095983984894898998999751636576150263056012501"), res, rem);
EXPECT_EQ(res, big_integer("-544977512069001243499439196429495600701"));
EXPECT_EQ(rem, big_integer("-66382358009926062210728796777352226675944219851838448875365359123421443108985378"));
big_integer("9739565432896546050040656034658762836457836886868678345021405632645902354063045608267340568346582")
.divide(big_integer("8263050146508634250640862503465899340625908694088569038"), res);
EXPECT_EQ(res, big_integer("1178688893351540421358600789386475098289416"));
}
TEST(bignum, TestOutputSimpleBigInteger) {
CheckOutputSimple<big_integer>(0);
CheckOutputSimple<big_integer>(1);
CheckOutputSimple<big_integer>(9);
CheckOutputSimple<big_integer>(10);
CheckOutputSimple<big_integer>(11);
CheckOutputSimple<big_integer>(19);
CheckOutputSimple<big_integer>(123);
CheckOutputSimple<big_integer>(1234);
CheckOutputSimple<big_integer>(12345);
CheckOutputSimple<big_integer>(123456);
CheckOutputSimple<big_integer>(1234567);
CheckOutputSimple<big_integer>(12345678);
CheckOutputSimple<big_integer>(123456789);
CheckOutputSimple<big_integer>(1234567890);
CheckOutputSimple<big_integer>(12345678909);
CheckOutputSimple<big_integer>(123456789098);
CheckOutputSimple<big_integer>(1234567890987);
CheckOutputSimple<big_integer>(12345678909876);
CheckOutputSimple<big_integer>(123456789098765);
CheckOutputSimple<big_integer>(1234567890987654);
CheckOutputSimple<big_integer>(12345678909876543);
CheckOutputSimple<big_integer>(123456789098765432);
CheckOutputSimple<big_integer>(1234567890987654321);
CheckOutputSimple<big_integer>(999999999999999999L);
CheckOutputSimple<big_integer>(999999999099999999L);
CheckOutputSimple<big_integer>(1000000000000000000L);
CheckOutputSimple<big_integer>(1000000000000000001L);
CheckOutputSimple<big_integer>(1000000005000000000L);
CheckOutputSimple<big_integer>(INT64_MAX);
CheckOutputSimple<big_integer>(-1);
CheckOutputSimple<big_integer>(-9);
CheckOutputSimple<big_integer>(-10);
CheckOutputSimple<big_integer>(-11);
CheckOutputSimple<big_integer>(-19);
CheckOutputSimple<big_integer>(-123);
CheckOutputSimple<big_integer>(-1234);
CheckOutputSimple<big_integer>(-12345);
CheckOutputSimple<big_integer>(-123456);
CheckOutputSimple<big_integer>(-1234567);
CheckOutputSimple<big_integer>(-12345678);
CheckOutputSimple<big_integer>(-123456789);
CheckOutputSimple<big_integer>(-1234567890);
CheckOutputSimple<big_integer>(-12345678909);
CheckOutputSimple<big_integer>(-123456789098);
CheckOutputSimple<big_integer>(-1234567890987);
CheckOutputSimple<big_integer>(-12345678909876);
CheckOutputSimple<big_integer>(-123456789098765);
CheckOutputSimple<big_integer>(-1234567890987654);
CheckOutputSimple<big_integer>(-12345678909876543);
CheckOutputSimple<big_integer>(-123456789098765432);
CheckOutputSimple<big_integer>(-1234567890987654321);
CheckOutputSimple<big_integer>(-999999999999999999L);
CheckOutputSimple<big_integer>(-999999999999999999L);
CheckOutputSimple<big_integer>(-1000000000000000000L);
CheckOutputSimple<big_integer>(-1000000000000000001L);
CheckOutputSimple<big_integer>(-1000000000000000000L);
CheckOutputSimple<big_integer>(INT64_MIN);
}
TEST(bignum, TestOutputSimpleDecimal) {
CheckOutputSimple<big_decimal>(0);
CheckOutputSimple<big_decimal>(1);
CheckOutputSimple<big_decimal>(9);
CheckOutputSimple<big_decimal>(10);
CheckOutputSimple<big_decimal>(11);
CheckOutputSimple<big_decimal>(19);
CheckOutputSimple<big_decimal>(123);
CheckOutputSimple<big_decimal>(1234);
CheckOutputSimple<big_decimal>(12345);
CheckOutputSimple<big_decimal>(123456);
CheckOutputSimple<big_decimal>(1234567);
CheckOutputSimple<big_decimal>(12345678);
CheckOutputSimple<big_decimal>(123456789);
CheckOutputSimple<big_decimal>(1234567890);
CheckOutputSimple<big_decimal>(12345678909);
CheckOutputSimple<big_decimal>(123456789098);
CheckOutputSimple<big_decimal>(1234567890987);
CheckOutputSimple<big_decimal>(12345678909876);
CheckOutputSimple<big_decimal>(123456789098765);
CheckOutputSimple<big_decimal>(1234567890987654);
CheckOutputSimple<big_decimal>(12345678909876543);
CheckOutputSimple<big_decimal>(123456789098765432);
CheckOutputSimple<big_decimal>(1234567890987654321);
CheckOutputSimple<big_decimal>(999999999999999999L);
CheckOutputSimple<big_decimal>(999999999099999999L);
CheckOutputSimple<big_decimal>(1000000000000000000L);
CheckOutputSimple<big_decimal>(1000000000000000001L);
CheckOutputSimple<big_decimal>(1000000005000000000L);
CheckOutputSimple<big_decimal>(INT64_MAX);
CheckOutputSimple<big_decimal>(-1);
CheckOutputSimple<big_decimal>(-9);
CheckOutputSimple<big_decimal>(-10);
CheckOutputSimple<big_decimal>(-11);
CheckOutputSimple<big_decimal>(-19);
CheckOutputSimple<big_decimal>(-123);
CheckOutputSimple<big_decimal>(-1234);
CheckOutputSimple<big_decimal>(-12345);
CheckOutputSimple<big_decimal>(-123456);
CheckOutputSimple<big_decimal>(-1234567);
CheckOutputSimple<big_decimal>(-12345678);
CheckOutputSimple<big_decimal>(-123456789);
CheckOutputSimple<big_decimal>(-1234567890);
CheckOutputSimple<big_decimal>(-12345678909);
CheckOutputSimple<big_decimal>(-123456789098);
CheckOutputSimple<big_decimal>(-1234567890987);
CheckOutputSimple<big_decimal>(-12345678909876);
CheckOutputSimple<big_decimal>(-123456789098765);
CheckOutputSimple<big_decimal>(-1234567890987654);
CheckOutputSimple<big_decimal>(-12345678909876543);
CheckOutputSimple<big_decimal>(-123456789098765432);
CheckOutputSimple<big_decimal>(-1234567890987654321);
CheckOutputSimple<big_decimal>(-999999999999999999L);
CheckOutputSimple<big_decimal>(-999999999099999999L);
CheckOutputSimple<big_decimal>(-1000000000000000000L);
CheckOutputSimple<big_decimal>(-1000000000000000001L);
CheckOutputSimple<big_decimal>(-1000000005000000000L);
CheckOutputSimple<big_decimal>(INT64_MIN);
}
TEST(bignum, TestInputOutputSimpleBigInteger) {
CheckInputOutput<big_integer>("0");
CheckInputOutput<big_integer>("1");
CheckInputOutput<big_integer>("2");
CheckInputOutput<big_integer>("9");
CheckInputOutput<big_integer>("10");
CheckInputOutput<big_integer>("1123");
CheckInputOutput<big_integer>("64539472569345602304");
CheckInputOutput<big_integer>("2376926357280573482539570263854");
CheckInputOutput<big_integer>(
"4078460509739485762306457364875609364258763498578235876432589345693645872686453947256"
"93456023046037490024067294087609279");
CheckInputOutput<big_integer>("1000000000000");
CheckInputOutput<big_integer>("1000000000000000000000000000");
CheckInputOutput<big_integer>("100000000000000000000000000000000000000000000000000000000000");
CheckInputOutput<big_integer>("99999999999999");
CheckInputOutput<big_integer>("99999999999999999999999999999999");
CheckInputOutput<big_integer>(
"9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999");
CheckInputOutput<big_integer>("-1");
CheckInputOutput<big_integer>("-2");
CheckInputOutput<big_integer>("-9");
CheckInputOutput<big_integer>("-10");
CheckInputOutput<big_integer>("-1123");
CheckInputOutput<big_integer>("-64539472569345602304");
CheckInputOutput<big_integer>("-2376926357280573482539570263854");
CheckInputOutput<big_integer>(
"-407846050973948576230645736487560936425876349857823587643258934569364587268645394725"
"693456023046037490024067294087609279");
CheckInputOutput<big_integer>("-1000000000000");
CheckInputOutput<big_integer>("-1000000000000000000000000000");
CheckInputOutput<big_integer>("-100000000000000000000000000000000000000000000000000000000000");
CheckInputOutput<big_integer>("-99999999999999");
CheckInputOutput<big_integer>("-99999999999999999999999999999999");
CheckInputOutput<big_integer>(
"-9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999");
}
TEST(bignum, TestInputOutputSimpleDecimal) {
CheckInputOutput<big_decimal>("0");
CheckInputOutput<big_decimal>("1");
CheckInputOutput<big_decimal>("2");
CheckInputOutput<big_decimal>("9");
CheckInputOutput<big_decimal>("10");
CheckInputOutput<big_decimal>("1123");
CheckInputOutput<big_decimal>("64539472569345602304");
CheckInputOutput<big_decimal>("2376926357280573482539570263854");
CheckInputOutput<big_decimal>(
"4078460509739485762306457364875609364258763498578235876432589345693645872686453947256"
"93456023046037490024067294087609279");
CheckInputOutput<big_decimal>("1000000000000");
CheckInputOutput<big_decimal>("1000000000000000000000000000");
CheckInputOutput<big_decimal>("100000000000000000000000000000000000000000000000000000000000");
CheckInputOutput<big_decimal>("99999999999999");
CheckInputOutput<big_decimal>("99999999999999999999999999999999");
CheckInputOutput<big_decimal>(
"9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999");
CheckInputOutput<big_decimal>("-1");
CheckInputOutput<big_decimal>("-2");
CheckInputOutput<big_decimal>("-9");
CheckInputOutput<big_decimal>("-10");
CheckInputOutput<big_decimal>("-1123");
CheckInputOutput<big_decimal>("-64539472569345602304");
CheckInputOutput<big_decimal>("-2376926357280573482539570263854");
CheckInputOutput<big_decimal>(
"-407846050973948576230645736487560936425876349857823587643258934569364587268645394725"
"693456023046037490024067294087609279");
CheckInputOutput<big_decimal>("-1000000000000");
CheckInputOutput<big_decimal>("-1000000000000000000000000000");
CheckInputOutput<big_decimal>("-100000000000000000000000000000000000000000000000000000000000");
CheckInputOutput<big_decimal>("-99999999999999");
CheckInputOutput<big_decimal>("-99999999999999999999999999999999");
CheckInputOutput<big_decimal>(
"-9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999");
CheckInputOutput<big_decimal>("0.1");
CheckInputOutput<big_decimal>("0.2");
CheckInputOutput<big_decimal>("0.3");
CheckInputOutput<big_decimal>("0.4");
CheckInputOutput<big_decimal>("0.5");
CheckInputOutput<big_decimal>("0.6");
CheckInputOutput<big_decimal>("0.7");
CheckInputOutput<big_decimal>("0.8");
CheckInputOutput<big_decimal>("0.9");
CheckInputOutput<big_decimal>("0.01");
CheckInputOutput<big_decimal>("0.001");
CheckInputOutput<big_decimal>("0.0001");
CheckInputOutput<big_decimal>("0.00001");
CheckInputOutput<big_decimal>("0.000001");
CheckInputOutput<big_decimal>("0.0000001");
CheckInputOutput<big_decimal>("0.00000000000000000000000000000000001");
CheckInputOutput<big_decimal>("0.10000000000000000000000000000000001");
CheckInputOutput<big_decimal>("0.10101010101010101010101010101010101");
CheckInputOutput<big_decimal>("0.99999999999999999999999999999999999");
CheckInputOutput<big_decimal>("0.79287502687354897253590684568634528762");
CheckInputOutput<big_decimal>("0.00000000000000000000000000000000000000000000000000000001");
CheckInputOutput<big_decimal>("0.10000000000000000000000000000000000000000000000000000001");
CheckInputOutput<big_decimal>("0.1111111111111111111111111111111111111111111111111111111111");
CheckInputOutput<big_decimal>("0.9999999999999999999999999999999999999999999999999999999999999999999");
CheckInputOutput<big_decimal>(
"0.436589746389567836745873648576289634589763845768268457683762864587684635892768346589629");
CheckInputOutput<big_decimal>(
"0."
"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
"0000000000000000000000000000000000001");
CheckInputOutput<big_decimal>(
"0."
"1000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
"0000000000000000000000000000000000001");
CheckInputOutput<big_decimal>(
"0."
"1111111111111111111111111111111111111111111111111111111111111111111111111111111111111"
"11111111111111111111111111111111111111111");
CheckInputOutput<big_decimal>(
"0."
"9999999999999999999999999999999999999999999999999999999999999999999999999999999999999"
"99999999999999999999999999999999999999999999999999");
CheckInputOutput<big_decimal>(
"0."
"4365897463895678367458736485762896345897638457682684576837628645876846358927683465493"
"85700256032605603246580726384075680247634627357023645889629");
CheckInputOutput<big_decimal>("-0.1");
CheckInputOutput<big_decimal>("-0.2");
CheckInputOutput<big_decimal>("-0.3");
CheckInputOutput<big_decimal>("-0.4");
CheckInputOutput<big_decimal>("-0.5");
CheckInputOutput<big_decimal>("-0.6");
CheckInputOutput<big_decimal>("-0.7");
CheckInputOutput<big_decimal>("-0.8");
CheckInputOutput<big_decimal>("-0.9");
CheckInputOutput<big_decimal>("-0.01");
CheckInputOutput<big_decimal>("-0.001");
CheckInputOutput<big_decimal>("-0.0001");
CheckInputOutput<big_decimal>("-0.00001");
CheckInputOutput<big_decimal>("-0.000001");
CheckInputOutput<big_decimal>("-0.0000001");
CheckInputOutput<big_decimal>("-0.00000000000000000000000000000000001");
CheckInputOutput<big_decimal>("-0.10000000000000000000000000000000001");
CheckInputOutput<big_decimal>("-0.10101010101010101010101010101010101");
CheckInputOutput<big_decimal>("-0.99999999999999999999999999999999999");
CheckInputOutput<big_decimal>("-0.79287502687354897253590684568634528762");
CheckInputOutput<big_decimal>("-0.00000000000000000000000000000000000000000000000000000001");
CheckInputOutput<big_decimal>("-0.10000000000000000000000000000000000000000000000000000001");
CheckInputOutput<big_decimal>("-0.1111111111111111111111111111111111111111111111111111111111");
CheckInputOutput<big_decimal>("-0.9999999999999999999999999999999999999999999999999999999999999999999");
CheckInputOutput<big_decimal>(
"-0.436589746389567836745873648576289634589763845768268457683762864587684635892768346589629");
CheckInputOutput<big_decimal>(
"-0."
"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
"0000000000000000000000000000000000001");
CheckInputOutput<big_decimal>(
"-0."
"1000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
"0000000000000000000000000000000000001");
CheckInputOutput<big_decimal>(
"-0."
"1111111111111111111111111111111111111111111111111111111111111111111111111111111111111"
"11111111111111111111111111111111111111111");
CheckInputOutput<big_decimal>(
"-0."
"9999999999999999999999999999999999999999999999999999999999999999999999999999999999999"
"99999999999999999999999999999999999999999999999999");
CheckInputOutput<big_decimal>(
"-0."
"4365897463895678367458736485762896345897638457682684576837628645876846358927683465493"
"85700256032605603246580726384075680247634627357023645889629");
CheckInputOutput<big_decimal>("1.1");
CheckInputOutput<big_decimal>("12.21");
CheckInputOutput<big_decimal>("123.321");
CheckInputOutput<big_decimal>("1234.4321");
CheckInputOutput<big_decimal>("12345.54321");
CheckInputOutput<big_decimal>("123456.654321");
CheckInputOutput<big_decimal>("1234567.7654321");
CheckInputOutput<big_decimal>("12345678.87654321");
CheckInputOutput<big_decimal>("123456789.987654321");
CheckInputOutput<big_decimal>("1234567890.0987654321");
CheckInputOutput<big_decimal>("12345678909.90987654321");
CheckInputOutput<big_decimal>("123456789098.890987654321");
CheckInputOutput<big_decimal>("1234567890987.7890987654321");
CheckInputOutput<big_decimal>("12345678909876.67890987654321");
CheckInputOutput<big_decimal>("123456789098765.567890987654321");
CheckInputOutput<big_decimal>("1234567890987654.4567890987654321");
CheckInputOutput<big_decimal>("12345678909876543.34567890987654321");
CheckInputOutput<big_decimal>("123456789098765432.234567890987654321");
CheckInputOutput<big_decimal>("1234567890987654321.1234567890987654321");
CheckInputOutput<big_decimal>("12345678909876543210.01234567890987654321");
CheckInputOutput<big_decimal>("10000000000000000000000000000000000000000000000000000000000000."
"000000000000000000000000000000000000000000000000000000000000001");
CheckInputOutput<big_decimal>("111111111111111111111111111111111111111111111111111111111111111111111."
"11111111111111111111111111111111111111111111111111111111111111");
CheckInputOutput<big_decimal>("99999999999999999999999999999999999999999999999999999999999999999999."
"99999999999999999999999999999999999999999999999999999999999999999999");
CheckInputOutput<big_decimal>("458796987658934265896483756892638456782376482605002747502306790283640563."
"12017054126750641065780784583204650763485718064875683468568360506340563042567");
CheckInputOutput<big_decimal>("-1.1");
CheckInputOutput<big_decimal>("-12.21");
CheckInputOutput<big_decimal>("-123.321");
CheckInputOutput<big_decimal>("-1234.4321");
CheckInputOutput<big_decimal>("-12345.54321");
CheckInputOutput<big_decimal>("-123456.654321");
CheckInputOutput<big_decimal>("-1234567.7654321");
CheckInputOutput<big_decimal>("-12345678.87654321");
CheckInputOutput<big_decimal>("-123456789.987654321");
CheckInputOutput<big_decimal>("-1234567890.0987654321");
CheckInputOutput<big_decimal>("-12345678909.90987654321");
CheckInputOutput<big_decimal>("-123456789098.890987654321");
CheckInputOutput<big_decimal>("-1234567890987.7890987654321");
CheckInputOutput<big_decimal>("-12345678909876.67890987654321");
CheckInputOutput<big_decimal>("-123456789098765.567890987654321");
CheckInputOutput<big_decimal>("-1234567890987654.4567890987654321");
CheckInputOutput<big_decimal>("-12345678909876543.34567890987654321");
CheckInputOutput<big_decimal>("-123456789098765432.234567890987654321");
CheckInputOutput<big_decimal>("-1234567890987654321.1234567890987654321");
CheckInputOutput<big_decimal>("-12345678909876543210.01234567890987654321");
CheckInputOutput<big_decimal>("-10000000000000000000000000000000000000000000000000000000000000."
"000000000000000000000000000000000000000000000000000000000000001");
CheckInputOutput<big_decimal>("-111111111111111111111111111111111111111111111111111111111111111111111."
"11111111111111111111111111111111111111111111111111111111111111");
CheckInputOutput<big_decimal>("-99999999999999999999999999999999999999999999999999999999999999999999."
"99999999999999999999999999999999999999999999999999999999999999999999");
CheckInputOutput<big_decimal>("-458796987658934265896483756892638456782376482605002747502306790283640563."
"12017054126750641065780784583204650763485718064875683468568360506340563042567");
}
TEST(bignum, TestInputSimpleDecimal) {
CheckOutputInput(big_decimal(0L));
CheckOutputInput(big_decimal(1L));
CheckOutputInput(big_decimal(9L));
CheckOutputInput(big_decimal(10L));
CheckOutputInput(big_decimal(11L));
CheckOutputInput(big_decimal(19L));
CheckOutputInput(big_decimal(123L));
CheckOutputInput(big_decimal(1234L));
CheckOutputInput(big_decimal(12345L));
CheckOutputInput(big_decimal(123456L));
CheckOutputInput(big_decimal(1234567L));
CheckOutputInput(big_decimal(12345678L));
CheckOutputInput(big_decimal(123456789L));
CheckOutputInput(big_decimal(1234567890L));
CheckOutputInput(big_decimal(12345678909L));
CheckOutputInput(big_decimal(123456789098L));
CheckOutputInput(big_decimal(1234567890987L));
CheckOutputInput(big_decimal(12345678909876L));
CheckOutputInput(big_decimal(123456789098765L));
CheckOutputInput(big_decimal(1234567890987654L));
CheckOutputInput(big_decimal(12345678909876543L));
CheckOutputInput(big_decimal(123456789098765432L));
CheckOutputInput(big_decimal(1234567890987654321L));
CheckOutputInput(big_decimal(999999999999999999L));
CheckOutputInput(big_decimal(999999999099999999L));
CheckOutputInput(big_decimal(1000000000000000000L));
CheckOutputInput(big_decimal(1000000000000000001L));
CheckOutputInput(big_decimal(1000000005000000000L));
CheckOutputInput(big_decimal(INT64_MAX));
CheckOutputInput(big_decimal(-1L));
CheckOutputInput(big_decimal(-9L));
CheckOutputInput(big_decimal(-10L));
CheckOutputInput(big_decimal(-11L));
CheckOutputInput(big_decimal(-19L));
CheckOutputInput(big_decimal(-123L));
CheckOutputInput(big_decimal(-1234L));
CheckOutputInput(big_decimal(-12345L));
CheckOutputInput(big_decimal(-123456L));
CheckOutputInput(big_decimal(-1234567L));
CheckOutputInput(big_decimal(-12345678L));
CheckOutputInput(big_decimal(-123456789L));
CheckOutputInput(big_decimal(-1234567890L));
CheckOutputInput(big_decimal(-12345678909L));
CheckOutputInput(big_decimal(-123456789098L));
CheckOutputInput(big_decimal(-1234567890987L));
CheckOutputInput(big_decimal(-12345678909876L));
CheckOutputInput(big_decimal(-123456789098765L));
CheckOutputInput(big_decimal(-1234567890987654L));
CheckOutputInput(big_decimal(-12345678909876543L));
CheckOutputInput(big_decimal(-123456789098765432L));
CheckOutputInput(big_decimal(-1234567890987654321L));
CheckOutputInput(big_decimal(-999999999999999999L));
CheckOutputInput(big_decimal(-999999999099999999L));
CheckOutputInput(big_decimal(-1000000000000000000L));
CheckOutputInput(big_decimal(-1000000000000000001L));
CheckOutputInput(big_decimal(-1000000005000000000L));
CheckOutputInput(big_decimal(INT64_MIN));
}
TEST(bignum, TestScalingSmall) {
big_decimal decimal(12345, 2);
EXPECT_EQ(decimal.get_precision(), 5);
decimal.set_scale(0, decimal);
EXPECT_EQ(decimal.get_precision(), 3);
EXPECT_EQ(decimal.to_int64(), 123);
}
TEST(bignum, TestScalingBig) {
big_integer big_int(69213205262741);
big_decimal decimal;
EXPECT_EQ(decimal.get_precision(), 1);
// 4790467782742318458842833081
big_int.multiply(big_int, big_int);
decimal = big_decimal(big_int, 0);
EXPECT_EQ(decimal.get_precision(), 28);
// 22948581577492104846692006446607391554788985798427952561
big_int.multiply(big_int, big_int);
decimal = big_decimal(big_int, 0);
EXPECT_EQ(decimal.get_precision(), 56);
// 22948581577492104846692006446607391554.788985798427952561
decimal = big_decimal(big_int, 18);
// 22948581577492104846692006446607391554
decimal.set_scale(0, decimal);
EXPECT_EQ(decimal.get_precision(), 38);
// 22948581.577492104846692006446607391554788985798427952561
decimal = big_decimal(big_int, 48);
// 22948581
decimal.set_scale(0, decimal);
EXPECT_EQ(decimal.get_precision(), 8);
EXPECT_EQ(decimal.to_int64(), 22948581);
// 636471904553811060306806140254026286906087997856914463925431295610150712
// 436301540552945788827650832722026963914694916372255230793492080431332686
// 268324254350022490844698008329270553114204362445999680199136593689695140
// 0874934591063287320666899465891248127072522251998904759858801
big_int.pow(5);
// 63647190455381106.030680614025402628690608799785691446392543129561015071
// 243630154055294578882765083272202696391469491637225523079349208043133268
// 626832425435002249084469800832927055311420436244599968019913659368969514
// 00874934591063287320666899465891248127072522251998904759858801
decimal = big_decimal(big_int, 260);
EXPECT_EQ(decimal.get_precision(), 277);
// 63647190455381106
decimal.set_scale(0, decimal);
EXPECT_EQ(decimal.get_precision(), 17);
EXPECT_EQ(decimal.to_int64(), 63647190455381106L);
decimal = big_decimal(1, 10000);
{
EXPECT_EQ(decimal.byte_size(), 3);
auto mag = decimal.get_unscaled_value().get_magnitude();
EXPECT_EQ(mag.size_words(), 1);
EXPECT_EQ(mag.size_bytes(), 4);
EXPECT_EQ(mag.size_bytes_non_zero(), 1);
EXPECT_EQ(mag[0], 0x1);
}
}
TEST(bignum, TestDecimalSimple) {
EXPECT_EQ(big_decimal(1000L, 3) + big_decimal(1000L, 3), big_decimal(2000L, 3));
EXPECT_EQ(big_decimal(1000L, 3) + big_decimal(1000L, 2), big_decimal(11000L, 3));
EXPECT_EQ(big_decimal(1000L, 3) + big_decimal(1000L, 1), big_decimal(101000L, 3));
EXPECT_EQ(big_decimal(1000L, 3) + big_decimal(1000L, 0), big_decimal(1001000L, 3));
EXPECT_EQ(big_decimal(1000L, 3) - big_decimal(1000L, 3), big_decimal(0L, std::int16_t(3)));
EXPECT_EQ(big_decimal(1000L, 3) - big_decimal(1000L, 2), big_decimal(-9000L, 3));
EXPECT_EQ(big_decimal(1000L, 3) - big_decimal(1000L, 1), big_decimal(-99000L, 3));
EXPECT_EQ(big_decimal(1000L, 3) - big_decimal(1000L, 0), big_decimal(-999000L, 3));
EXPECT_EQ(big_decimal(1000L, 3) * big_decimal(1000L, 3), big_decimal(1000L, 3));
EXPECT_EQ(big_decimal(1000L, 3) * big_decimal(1000L, 2), big_decimal(10000L, 3));
EXPECT_EQ(big_decimal(1000L, 3) * big_decimal(1000L, 1), big_decimal(100000L, 3));
EXPECT_EQ(big_decimal(1000L, 3) * big_decimal(1000L, 0), big_decimal(1000000L, 3));
EXPECT_EQ(big_decimal(1000L, 3) / big_decimal(1000L, 3), big_decimal(1000L, 3));
EXPECT_EQ(big_decimal(1000L, 3) / big_decimal(1000L, 2), big_decimal(100L, 3));
EXPECT_EQ(big_decimal(1000L, 3) / big_decimal(1000L, 1), big_decimal(10L, 3));
EXPECT_EQ(big_decimal(1000L, 3) / big_decimal(1000L, 0), big_decimal(1L, 3));
// Generated tests
// Test with negative numbers
EXPECT_EQ(big_decimal(-1000L, 3) / big_decimal(1000L, 3), big_decimal(-1000L, 3));
EXPECT_EQ(big_decimal(1000L, 3) / big_decimal(-1000L, 3), big_decimal(-1000L, 3));
EXPECT_EQ(big_decimal(-1000L, 3) / big_decimal(-1000L, 3), big_decimal(1000L, 3));
// Test with zero
EXPECT_EQ(big_decimal(0L, std::int16_t(3)) / big_decimal(1000L, 3), big_decimal(0L, std::int16_t(3)));
// Test with a large scale
EXPECT_EQ(big_decimal(123456789L, 100) / big_decimal(100000000L, 100), big_decimal(123456789L, 8));
// Test with different scales
EXPECT_EQ(big_decimal(123456789L, 5) / big_decimal(100000000L, 3), big_decimal(123456789L, 10));
EXPECT_EQ(big_decimal(123456789L, 3) / big_decimal(100000000L, 5), big_decimal(123456789L, 6));
// Test scale after divide
EXPECT_EQ(big_decimal(123456789L, 0) / big_decimal(100000000L, 0), big_decimal(123456789L, 8));
EXPECT_EQ(big_decimal(123456789L, 0) / big_decimal(100000000L, 1), big_decimal(123456789L, 7));
EXPECT_EQ(big_decimal(123456789L, 0) / big_decimal(100000000L, 2), big_decimal(123456789L, 6));
EXPECT_EQ(big_decimal(123456789L, 0) / big_decimal(100000000L, 3), big_decimal(123456789L, 5));
EXPECT_EQ(big_decimal(123456789L, 0) / big_decimal(100000000L, 4), big_decimal(123456789L, 4));
EXPECT_EQ(big_decimal(123456789L, 0) / big_decimal(100000000L, 5), big_decimal(123456789L, 3));
EXPECT_EQ(big_decimal(123456789L, 0) / big_decimal(100000000L, 6), big_decimal(123456789L, 2));
EXPECT_EQ(big_decimal(123456789L, 0) / big_decimal(100000000L, 7), big_decimal(123456789L, 1));
EXPECT_EQ(big_decimal(123456789L, 0) / big_decimal(100000000L, 8), big_decimal(123456789L, 0));
EXPECT_EQ(big_decimal(123456789L, 0) / big_decimal(100000000L, 0), big_decimal(123456789L, 8));
EXPECT_EQ(big_decimal(123456789L, 1) / big_decimal(100000000L, 0), big_decimal(123456789L, 9));
EXPECT_EQ(big_decimal(123456789L, 2) / big_decimal(100000000L, 0), big_decimal(123456789L, 10));
EXPECT_EQ(big_decimal(123456789L, 3) / big_decimal(100000000L, 0), big_decimal(123456789L, 11));
EXPECT_EQ(big_decimal(123456789L, 4) / big_decimal(100000000L, 0), big_decimal(123456789L, 12));
EXPECT_EQ(big_decimal(123456789L, 5) / big_decimal(100000000L, 0), big_decimal(123456789L, 13));
EXPECT_EQ(big_decimal(123456789L, 6) / big_decimal(100000000L, 0), big_decimal(123456789L, 14));
EXPECT_EQ(big_decimal(123456789L, 7) / big_decimal(100000000L, 0), big_decimal(123456789L, 15));
EXPECT_EQ(big_decimal(123456789L, 8) / big_decimal(100000000L, 0), big_decimal(123456789L, 16));
EXPECT_EQ(big_decimal(123456789L, 0) / big_decimal(100000000L, 8), big_decimal(123456789L, 0));
EXPECT_EQ(big_decimal(123456789L, 1) / big_decimal(100000000L, 7), big_decimal(123456789L, 2));
EXPECT_EQ(big_decimal(123456789L, 2) / big_decimal(100000000L, 6), big_decimal(123456789L, 4));
EXPECT_EQ(big_decimal(123456789L, 3) / big_decimal(100000000L, 5), big_decimal(123456789L, 6));
EXPECT_EQ(big_decimal(123456789L, 4) / big_decimal(100000000L, 4), big_decimal(123456789L, 8));
EXPECT_EQ(big_decimal(123456789L, 5) / big_decimal(100000000L, 3), big_decimal(123456789L, 10));
EXPECT_EQ(big_decimal(123456789L, 6) / big_decimal(100000000L, 2), big_decimal(123456789L, 12));
EXPECT_EQ(big_decimal(123456789L, 7) / big_decimal(100000000L, 1), big_decimal(123456789L, 14));
EXPECT_EQ(big_decimal(123456789L, 8) / big_decimal(100000000L, 0), big_decimal(123456789L, 16));
// Random
EXPECT_EQ(big_decimal(98094819054L, 2) + big_decimal(24689666136L, 1), big_decimal(344991480414L, 2));
EXPECT_EQ(big_decimal(58628397409L, 6) + big_decimal(45577616757L, 4), big_decimal(4616390073109L, 6));
EXPECT_EQ(big_decimal(98094819054L, 2) * big_decimal(24689666136L, 1), big_decimal("2421928332114591355.344"));
EXPECT_EQ(big_decimal(58628397409L, 6) * big_decimal(45577616757L, 4), big_decimal("267214262818.4493782613"));
EXPECT_EQ(big_decimal(98094819054L, 2) / big_decimal(24689666136L, 1), big_decimal(3973112415277L, 13));
EXPECT_EQ(big_decimal(58628397409L, 6) / big_decimal(45577616757L, 4), big_decimal(1286341884034L, 14));
}
TEST(bignum, TestPrecisionSimple) {
big_decimal test(1L);
EXPECT_EQ(big_decimal(-9L).get_precision(), 1);
EXPECT_EQ(big_decimal(-8L).get_precision(), 1);
EXPECT_EQ(big_decimal(-7L).get_precision(), 1);
EXPECT_EQ(big_decimal(-6L).get_precision(), 1);
EXPECT_EQ(big_decimal(-5L).get_precision(), 1);
EXPECT_EQ(big_decimal(-4L).get_precision(), 1);
EXPECT_EQ(big_decimal(-3L).get_precision(), 1);
EXPECT_EQ(big_decimal(-2L).get_precision(), 1);
EXPECT_EQ(big_decimal(-1L).get_precision(), 1);
EXPECT_EQ(big_decimal(0L).get_precision(), 1);
EXPECT_EQ(big_decimal(1L).get_precision(), 1);
EXPECT_EQ(big_decimal(2L).get_precision(), 1);
EXPECT_EQ(big_decimal(3L).get_precision(), 1);
EXPECT_EQ(big_decimal(4L).get_precision(), 1);
EXPECT_EQ(big_decimal(5L).get_precision(), 1);
EXPECT_EQ(big_decimal(6L).get_precision(), 1);
EXPECT_EQ(big_decimal(7L).get_precision(), 1);
EXPECT_EQ(big_decimal(8L).get_precision(), 1);
EXPECT_EQ(big_decimal(9L).get_precision(), 1);
EXPECT_EQ(big_decimal(2147483648L).get_precision(), 10); // 2^31: 10 digits
EXPECT_EQ(big_decimal(-2147483647L).get_precision(), 10); // -2^31+1: 10 digits
EXPECT_EQ(big_decimal(98893745455L).get_precision(), 11); // random: 11 digits
EXPECT_EQ(big_decimal(3455436789887L).get_precision(), 13); // random: 13 digits
EXPECT_EQ(big_decimal(140737488355328L).get_precision(), 15); // 2^47: 15 digits
EXPECT_EQ(big_decimal(-140737488355328L).get_precision(), 15); // -2^47: 15 digits
EXPECT_EQ(big_decimal(7564232235739573L).get_precision(), 16); // random: 16 digits
EXPECT_EQ(big_decimal(25335434990002322L).get_precision(), 17); // random: 17 digits
EXPECT_EQ(big_decimal(9223372036854775807L).get_precision(), 19); // 2^63 - 1: 19 digits
EXPECT_EQ(big_decimal(-9223372036854775807L).get_precision(), 19); // -2^63 + 1: 19 digits
}
TEST(bignum, TestPrecisionChange) {
big_integer big_int(32421);
// 75946938183
big_int.multiply(big_integer(2342523), big_int);
// 4244836901495581620
big_int.multiply(big_integer(55892140), big_int);
// 1361610054778960404282184020
big_int.multiply(big_integer(320768521), big_int);
// 1454144449122723409814375680476734820
big_int.multiply(big_integer(1067959541), big_int);
// 117386322514277938455905731466723946155156640
big_int.multiply(big_integer(80725352), big_int);
// 1173863225142779384559.05731466723946155156640
big_decimal decimal(big_int, 23);
EXPECT_EQ(decimal.get_precision(), 45);
EXPECT_EQ(decimal.get_scale(), 23);
for (int16_t i = 0; i < decimal.get_scale(); ++i) {
decimal.set_scale(i, decimal);
EXPECT_EQ(decimal.get_precision(), decimal.get_precision() - decimal.get_scale() + i);
}
}
TEST(bignum, TestDoubleCast) {
CheckDoubleCast(100000000000000.0);
CheckDoubleCast(10000000000000.0);
CheckDoubleCast(1000000000000.0);
CheckDoubleCast(100000000000.0);
CheckDoubleCast(10000000000.0);
CheckDoubleCast(1000000000.0);
CheckDoubleCast(100000000.0);
CheckDoubleCast(10000000.0);
CheckDoubleCast(1000000.0);
CheckDoubleCast(100000.0);
CheckDoubleCast(10000.0);
CheckDoubleCast(1000.0);
CheckDoubleCast(100.0);
CheckDoubleCast(10.0);
CheckDoubleCast(1.0);
CheckDoubleCast(0.1);
CheckDoubleCast(0.01);
CheckDoubleCast(0.001);
CheckDoubleCast(0.0001);
CheckDoubleCast(0.00001);
CheckDoubleCast(0.000001);
CheckDoubleCast(0.0000001);
CheckDoubleCast(0.00000001);
CheckDoubleCast(0.000000001);
CheckDoubleCast(0.0000000001);
CheckDoubleCast(0.00000000001);
CheckDoubleCast(0.000000000001);
CheckDoubleCast(0.00000000000001);
CheckDoubleCast(0.000000000000001);
CheckDoubleCast(2379506093465806.);
CheckDoubleCast(172650963870256.3);
CheckDoubleCast(63506206502638.57);
CheckDoubleCast(8946589364589.763);
CheckDoubleCast(896258976348.9568);
CheckDoubleCast(28967349256.39428);
CheckDoubleCast(2806348972.689369);
CheckDoubleCast(975962354.2835845);
CheckDoubleCast(96342568.93542342);
CheckDoubleCast(6875825.934892387);
CheckDoubleCast(314969.6543969458);
CheckDoubleCast(32906.02476506344);
CheckDoubleCast(9869.643965396453);
CheckDoubleCast(779.6932689452953);
CheckDoubleCast(75.93592963492326);
CheckDoubleCast(8.719654293587452);
CheckDoubleCast(.90001236587463439);
CheckDoubleCast(-235235E-100);
CheckDoubleCast(-235235E-90);
CheckDoubleCast(-235235E-80);
CheckDoubleCast(-235235E-70);
CheckDoubleCast(-235235E-60);
CheckDoubleCast(-235235E-50);
CheckDoubleCast(-235235E-40);
CheckDoubleCast(-235235E-30);
CheckDoubleCast(-235235E-25);
CheckDoubleCast(-235235E-20);
CheckDoubleCast(-235235E-15);
CheckDoubleCast(-235235E-10);
CheckDoubleCast(-235235E-9);
CheckDoubleCast(-235235E-8);
CheckDoubleCast(-235235E-7);
CheckDoubleCast(-235235E-6);
CheckDoubleCast(-235235E-5);
CheckDoubleCast(-235235E-4);
CheckDoubleCast(-235235E-2);
CheckDoubleCast(-235235E-1);
CheckDoubleCast(-235235);
CheckDoubleCast(-235235E+1);
CheckDoubleCast(-235235E+2);
CheckDoubleCast(-235235E+3);
CheckDoubleCast(-235235E+4);
CheckDoubleCast(-235235E+5);
CheckDoubleCast(-235235E+6);
CheckDoubleCast(-235235E+7);
CheckDoubleCast(-235235E+8);
CheckDoubleCast(-235235E+9);
CheckDoubleCast(-235235E+10);
CheckDoubleCast(-235235E+15);
CheckDoubleCast(-235235E+20);
CheckDoubleCast(-235235E+25);
CheckDoubleCast(-235235E+30);
CheckDoubleCast(-235235E+40);
CheckDoubleCast(-235235E+50);
CheckDoubleCast(-235235E+60);
CheckDoubleCast(-235235E+70);
CheckDoubleCast(-235235E+80);
CheckDoubleCast(-235235E+90);
CheckDoubleCast(-235235E+100);
CheckDoubleCast(-2379506093465806.);
CheckDoubleCast(-172650963870256.3);
CheckDoubleCast(-63506206502638.57);
CheckDoubleCast(-8946589364589.763);
CheckDoubleCast(-896258976348.9568);
CheckDoubleCast(-28967349256.39428);
CheckDoubleCast(-2806348972.689369);
CheckDoubleCast(-975962354.2835845);
CheckDoubleCast(-96342568.93542342);
CheckDoubleCast(-6875825.934892387);
CheckDoubleCast(-314969.6543969458);
CheckDoubleCast(-32906.02476506344);
CheckDoubleCast(-9869.643965396453);
CheckDoubleCast(-779.6932689452953);
CheckDoubleCast(-75.93592963492326);
CheckDoubleCast(-8.719654293587452);
CheckDoubleCast(-.90001236587463439);
CheckDoubleCast(-100000000000000.0);
CheckDoubleCast(-10000000000000.0);
CheckDoubleCast(-1000000000000.0);
CheckDoubleCast(-100000000000.0);
CheckDoubleCast(-10000000000.0);
CheckDoubleCast(-1000000000.0);
CheckDoubleCast(-100000000.0);
CheckDoubleCast(-10000000.0);
CheckDoubleCast(-1000000.0);
CheckDoubleCast(-100000.0);
CheckDoubleCast(-10000.0);
CheckDoubleCast(-1000.0);
CheckDoubleCast(-100.0);
CheckDoubleCast(-10.0);
CheckDoubleCast(-1.0);
CheckDoubleCast(-0.1);
CheckDoubleCast(-0.01);
CheckDoubleCast(-0.001);
CheckDoubleCast(-0.0001);
CheckDoubleCast(-0.00001);
CheckDoubleCast(-0.000001);
CheckDoubleCast(-0.0000001);
CheckDoubleCast(-0.00000001);
CheckDoubleCast(-0.000000001);
CheckDoubleCast(-0.0000000001);
CheckDoubleCast(-0.00000000001);
CheckDoubleCast(-0.000000000001);
CheckDoubleCast(-0.00000000000001);
CheckDoubleCast(-0.000000000000001);
}