I am trying to better understand how 'big numbers' libraries work, (like GMP for example).
I want to write my own function to Add() / Subtract() / Multiply() / Divide()
The class is traditionally defined ...
std::vector<unsigned char> _numbers; // all the numbers bool _neg; // positive or negative number long _decimalPos; // where the decimal point is located // so 10.5 would be 1 // 10.25 would be 2 // 10 would be 0 for example First I need to normalise the numbers so I can do
Using 2 numbers 10(x) + 10.25(y) = 20.25
For simplicity, I would make them the same length,
For x: _numbers = (1,0,0,0) decimal = 2
For y: _numbers = (1,0,2,5) decimal = 2
And I can then reverse add x to y in a loop
... // where x is 10.00 and y is 10.25 ... unsigned char carryOver = 0; int totalLen = x._numbers.size(); for (size_t i = totalLen; i > 1 ; --i ) { unsigned char sum = x._numbers[i-1] + y._numbers[i-1] + carryOver; carryOver = 0; if (sum > _base) { sum -= _base; carryOver = 1; } numbers.insert( number.begin(), sum); } // any left over? if (carryOver > 0) { numbers.insert( number.begin(), 1 ); } // decimal pos is the same for this number as x and y ... The example above will work for adding two positive numbers, but will soon fall over once I need to add a negative number to a positive number.
And this gets more complicated when it comes to subtracting numbers, then even worse for multiplications and divisions.
Can someone suggest some simple functions to Add() / Subtract() / Multiply() / Divide()
I am not trying to re-write / improve libraries, I just want to understand how they work with numbers.