-
Notifications
You must be signed in to change notification settings - Fork 0
/
bignum.h
146 lines (108 loc) · 4.67 KB
/
bignum.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
/*
BigNumbers - Arbitrary precision arithmetic
Copyright 2000-2010, Ibán Cereijo Graña <ibancg at gmail dot com>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef __BIGNUMBER_H_
#define __BIGNUMBER_H_
// Arbitrary-precision fixed-point arithmetic.
//
// A BCD system with sign and modulus representation and decimal adjustment
// has been chosen, so each figure represents a decimal digit.
#include <ostream>
#include <iostream>
#include <vector>
#include "config.h"
class BigNumber {
private:
std::vector<bcd_t> digits;
bool positive; // positive/!negative flag
long int nDigits;
long int nFracDigits;
void parse(const char *);
public:
static long N_DIGITS; // number of digits in the format.
static long N_FRAC_DIGITS; // number of fractional digits.
// Constructors.
// Creates an empty bignumber
BigNumber(long int nDigits = N_DIGITS,
long int nFracDigits = N_FRAC_DIGITS);
BigNumber(const BigNumber&);
// Creates a bignumber from a string, example: N = BigNumber("-1786.059e36");
BigNumber(const char *, long int nDigits = N_DIGITS, long int nFracDigits =
N_FRAC_DIGITS);
BigNumber(double, long int nDigits = N_DIGITS, long int nFracDigits =
N_FRAC_DIGITS);
~BigNumber();
// Assign operator
BigNumber& operator=(const BigNumber&);
// sets to 0
void clear();
void resize(long int nDigits = N_DIGITS, long int nFracDigits =
N_FRAC_DIGITS);
void resize(const BigNumber&);
double toDouble() const;
void fromDouble(double);
void toDouble(double&, long int&) const;
void fromDouble(double, long int);
bool isPositive_() const;
// Visualisation. The parameter threshold configures the limit in number of
// digits below which all the digits are shown. If the number of digits is
// greater than the threshold, a format like 1274...0246.5162...2134 is
// used. When this short notation is used, shortNotationDigits digits are
// depicted in each group
void show(std::ostream& ostream = std::cout, int threshold = 15000,
int shortNotationDigits = 9) const;
// Tests if two BNs are equal
friend bool operator==(const BigNumber& A, const BigNumber& B);
// Compares two BNs and returns the number of mathing digits
friend int matchingDigits(const BigNumber& A, const BigNumber& B);
friend bool matchDimensions(const BigNumber& A, const BigNumber& B);
// First non-zero digit index.
int firstNonZeroDigitIndex() const;
bcd_t operator()(int) const;
bcd_t& operator()(int);
bcd_t operator[](int) const;
bcd_t& operator[](int);
long int getNDigits() const;
long int getNFracDigits() const;
long int getNIntDigits() const;
// Operations.
// Computes C = A + B. If the result is zero, the sign can be explicitly set.
// A, B and C are overlappables.
friend void add(const BigNumber& A, const BigNumber& B, BigNumber& C,
bool sign = true);
// Computes C = A - B. If the result is zero, the sign can be explicitly set.
// A, B and C are overlappables.
friend void sub(const BigNumber& A, const BigNumber& B, BigNumber& C,
bool sign = true);
// Computes C = A*B
// A, B and C are overlappables
friend void mul(const BigNumber& A, const BigNumber& B, BigNumber& C);
friend void mulFFT(const BigNumber& A, const BigNumber& B, BigNumber& C);
friend void mulLMA(const BigNumber& A, const BigNumber& B, BigNumber& C);
// Computes the inverse of A, B = 1/A
friend void inv(const BigNumber& A, BigNumber& B);
// Computes C = A/B
friend void div(const BigNumber& A, const BigNumber& B, BigNumber& C);
friend void divLDA(const BigNumber& A, const BigNumber& B, BigNumber& C);
friend void divInv(const BigNumber& A, const BigNumber& B, BigNumber& C);
// Computes the square root
friend void sqrt(const BigNumber& A, BigNumber& B);
friend void sqrtInv(const BigNumber& A, BigNumber& B);
friend void sqrtNoInv(const BigNumber& A, BigNumber& B);
// Computes the quartic root
friend void sqrt4(const BigNumber& A, BigNumber& B);
friend void sqrt4Inv(const BigNumber& A, BigNumber& B);
friend void sqrt4NoInv(const BigNumber& A, BigNumber& B);
};
#endif