added: to samples: big2.cpp with TTMATH_BITS() macro
git-svn-id: svn://ttmath.org/publicrep/ttmath/trunk@285 e52654a7-88a9-db11-a3e9-0013d4bc506e
This commit is contained in:
parent
35f2a8a28b
commit
053861655d
|
@ -8,7 +8,7 @@ CFLAGS = -Wall -pedantic -s -O2 -I..
|
||||||
$(CC) -c $(CFLAGS) $<
|
$(CC) -c $(CFLAGS) $<
|
||||||
|
|
||||||
|
|
||||||
all: uint int big parser
|
all: uint int big big2 parser
|
||||||
|
|
||||||
|
|
||||||
uint: uint.o
|
uint: uint.o
|
||||||
|
@ -20,6 +20,9 @@ int: int.o
|
||||||
big: big.o
|
big: big.o
|
||||||
$(CC) -o big $(CFLAGS) big.o
|
$(CC) -o big $(CFLAGS) big.o
|
||||||
|
|
||||||
|
big2: big2.o
|
||||||
|
$(CC) -o big2 $(CFLAGS) big2.o
|
||||||
|
|
||||||
parser: parser.o
|
parser: parser.o
|
||||||
$(CC) -o parser $(CFLAGS) parser.o
|
$(CC) -o parser $(CFLAGS) parser.o
|
||||||
|
|
||||||
|
@ -27,6 +30,7 @@ parser: parser.o
|
||||||
uint.o: uint.cpp
|
uint.o: uint.cpp
|
||||||
int.o: int.cpp
|
int.o: int.cpp
|
||||||
big.o: big.cpp
|
big.o: big.cpp
|
||||||
|
big2.o: big2.cpp
|
||||||
parser.o: parser.cpp
|
parser.o: parser.cpp
|
||||||
|
|
||||||
|
|
||||||
|
@ -36,6 +40,7 @@ clean:
|
||||||
rm -f uint
|
rm -f uint
|
||||||
rm -f int
|
rm -f int
|
||||||
rm -f big
|
rm -f big
|
||||||
|
rm -f big2
|
||||||
rm -f parser
|
rm -f parser
|
||||||
# on MS Windows can automatically be added suffixes .exe to the names of output programs
|
# on MS Windows can automatically be added suffixes .exe to the names of output programs
|
||||||
rm -f *.exe
|
rm -f *.exe
|
||||||
|
|
|
@ -5,8 +5,10 @@
|
||||||
// this type has 2 words for its mantissa and 1 word for its exponent
|
// 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,
|
// (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)
|
// and on a 64bit platform one word means a word of 64 bits)
|
||||||
|
|
||||||
|
// Big<exponent, mantissa>
|
||||||
typedef ttmath::Big<1,2> MyBig;
|
typedef ttmath::Big<1,2> MyBig;
|
||||||
|
|
||||||
|
|
||||||
void SimpleCalculating(const MyBig & a, const MyBig & b)
|
void SimpleCalculating(const MyBig & a, const MyBig & b)
|
||||||
{
|
{
|
||||||
|
@ -56,6 +58,7 @@ MyBig atemp;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int main()
|
int main()
|
||||||
{
|
{
|
||||||
MyBig a,b;
|
MyBig a,b;
|
||||||
|
@ -86,12 +89,12 @@ b = 98767878.124322
|
||||||
a + b = 98891334.667778
|
a + b = 98891334.667778
|
||||||
a - b = -98644421.580866
|
a - b = -98644421.580866
|
||||||
a * b = 12193540837712.2708
|
a * b = 12193540837712.2708
|
||||||
a / b = 0.0012499665458095765
|
a / b = 0.00124996654580957646
|
||||||
Calculating with a carry
|
Calculating with a carry
|
||||||
a = 1.624801256070839555e+646457012
|
a = 1.624801256066640878e+646457012
|
||||||
b = 456.31999999999999
|
b = 456.319999999999993
|
||||||
a + b = 1.624801256070839555e+646457012
|
a + b = 1.624801256066640878e+646457012
|
||||||
a - b = 1.624801256070839555e+646457012
|
a - b = 1.624801256066640878e+646457012
|
||||||
a * b = (carry)
|
a * b = (carry)
|
||||||
a / b = 3.56066193914542334e+646457009
|
a / b = 3.560661939136222174e+646457009
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -0,0 +1,113 @@
|
||||||
|
#include <ttmath/ttmath.h>
|
||||||
|
#include <iostream>
|
||||||
|
|
||||||
|
|
||||||
|
// 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<exponent, mantissa>
|
||||||
|
typedef ttmath::Big<TTMATH_BITS(64), TTMATH_BITS(128)> 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
|
||||||
|
*/
|
Loading…
Reference in New Issue