diff --git a/samples/Makefile b/samples/Makefile index 187b9a9..3303ccd 100644 --- a/samples/Makefile +++ b/samples/Makefile @@ -8,7 +8,7 @@ CFLAGS = -Wall -pedantic -s -O2 -I.. $(CC) -c $(CFLAGS) $< -all: uint int big parser +all: uint int big big2 parser uint: uint.o @@ -20,6 +20,9 @@ int: int.o big: big.o $(CC) -o big $(CFLAGS) big.o +big2: big2.o + $(CC) -o big2 $(CFLAGS) big2.o + parser: parser.o $(CC) -o parser $(CFLAGS) parser.o @@ -27,6 +30,7 @@ parser: parser.o uint.o: uint.cpp int.o: int.cpp big.o: big.cpp +big2.o: big2.cpp parser.o: parser.cpp @@ -36,6 +40,7 @@ clean: rm -f uint rm -f int rm -f big + rm -f big2 rm -f parser # on MS Windows can automatically be added suffixes .exe to the names of output programs rm -f *.exe diff --git a/samples/big.cpp b/samples/big.cpp index 9b765c2..8e9fa6a 100644 --- a/samples/big.cpp +++ b/samples/big.cpp @@ -5,8 +5,10 @@ // this type has 2 words for its mantissa and 1 word for its exponent // (on a 32bit platform one word means a word of 32 bits, // and on a 64bit platform one word means a word of 64 bits) + +// Big typedef ttmath::Big<1,2> MyBig; - + void SimpleCalculating(const MyBig & a, const MyBig & b) { @@ -56,6 +58,7 @@ MyBig atemp; } + int main() { MyBig a,b; @@ -86,12 +89,12 @@ b = 98767878.124322 a + b = 98891334.667778 a - b = -98644421.580866 a * b = 12193540837712.2708 -a / b = 0.0012499665458095765 +a / b = 0.00124996654580957646 Calculating with a carry -a = 1.624801256070839555e+646457012 -b = 456.31999999999999 -a + b = 1.624801256070839555e+646457012 -a - b = 1.624801256070839555e+646457012 +a = 1.624801256066640878e+646457012 +b = 456.319999999999993 +a + b = 1.624801256066640878e+646457012 +a - b = 1.624801256066640878e+646457012 a * b = (carry) -a / b = 3.56066193914542334e+646457009 +a / b = 3.560661939136222174e+646457009 */ diff --git a/samples/big2.cpp b/samples/big2.cpp new file mode 100644 index 0000000..fcb74bf --- /dev/null +++ b/samples/big2.cpp @@ -0,0 +1,113 @@ +#include +#include + + +// this is a similar example to big.cpp +// but now we're using TTMATH_BITS() macro +// this macro returns how many words we need to store +// the given number of bits + +// TTMATH_BITS(64) +// on a 32bit platform the macro returns 2 (2*32=64) +// on a 64bit platform the macro returns 1 + +// TTMATH_BITS(128) +// on a 32bit platform the macro returns 4 (4*32=128) +// on a 64bit platform the macro returns 2 (2*64=128) + +// Big +typedef ttmath::Big MyBig; + +// consequently on a 32bit platform we define: Big<2, 4> +// and on a 64bit platform: Big<1, 2> +// and the calculations will be the same on both platforms + + +void SimpleCalculating(const MyBig & a, const MyBig & b) +{ + std::cout << "Simple calculating" << std::endl; + std::cout << "a = " << a << std::endl; + std::cout << "b = " << b << std::endl; + std::cout << "a + b = " << a+b << std::endl; + std::cout << "a - b = " << a-b << std::endl; + std::cout << "a * b = " << a*b << std::endl; + std::cout << "a / b = " << a/b << std::endl; +} + + +void CalculatingWithCarry(const MyBig & a, const MyBig & b) +{ +MyBig atemp; + + std::cout << "Calculating with a carry" << std::endl; + std::cout << "a = " << a << std::endl; + std::cout << "b = " << b << std::endl; + + atemp = a; + if( !atemp.Add(b) ) + std::cout << "a + b = " << atemp << std::endl; + else + std::cout << "a + b = (carry)" << std::endl; + // it have no sense to print 'atemp' (it's undefined) + + atemp = a; + if( !atemp.Sub(b) ) + std::cout << "a - b = " << atemp << std::endl; + else + std::cout << "a - b = (carry)" << std::endl; + + atemp = a; + if( !atemp.Mul(b) ) + std::cout << "a * b = " << atemp << std::endl; + else + std::cout << "a * b = (carry)" << std::endl; + + + atemp = a; + if( !atemp.Div(b) ) + std::cout << "a / b = " << atemp << std::endl; + else + std::cout << "a / b = (carry or division by zero) " << std::endl; + +} + + +int main() +{ +MyBig a,b; + + // conversion from 'const char *' + a = "123456.543456"; + b = "98767878.124322"; + + SimpleCalculating(a,b); + + // 'a' will have the max value which can be held in this type + a.SetMax(); + + // conversion from double + b = 456.32; + + // Look at the value 'a' and the product from a+b and a-b + // Don't worry this is the nature of floating point numbers + CalculatingWithCarry(a,b); +} + +/* +the result (the same on a 32 or 64bit platform): + +Simple calculating +a = 123456.543456 +b = 98767878.124322 +a + b = 98891334.667778 +a - b = -98644421.580866 +a * b = 12193540837712.270763536832 +a / b = 0.001249966545809576460596448526166860913 +Calculating with a carry +a = 2.3495345545711177736883282090959505003e+2776511644261678604 +b = 456.3199999999999931787897367030382156 +a + b = 2.3495345545711177736883282090959505003e+2776511644261678604 +a - b = 2.3495345545711177736883282090959505003e+2776511644261678604 +a * b = (carry) +a / b = 5.1488748127873374141170361292780486452e+2776511644261678601 +*/