23 #ifndef PRECISION_FLOAT_H_INCLUDED 24 #define PRECISION_FLOAT_H_INCLUDED 32 const int maxMantisseSize = 64;
34 std::pair<int_ap<2>,
int> decomposeLongFloat(
long double number);
37 float_sap<base> decomposeLongFloat(
long double number)
39 std::pair<int_ap<2>,
int> res = decomposeLongFloat(number);
40 int_ap<base> convertedMantissa = res.first.convert<base>();
41 int exponent = res.second - res.first.size();
43 float_sap<base> baseFactor;
44 int_ap<base> baseNum(1), baseDenom(1);
46 baseDenom = int_ap(1);
47 baseNum = pow(int_ap<base>(2), int_ap<base>(exponent));
49 else if (exponent < 0){
51 baseDenom = pow(int_ap<base>(2), int_ap<base>(-exponent));
53 int_ap<base> baseMantissa, baseExponent;
54 dividePrecision(baseNum, baseDenom, baseMantissa, baseExponent);
55 baseFactor = float_sap<base>(baseMantissa, baseExponent);
56 float_sap<base> result(convertedMantissa,
57 int_ap<base>(convertedMantissa.size())-1);
79 float_sap(
const std::vector<short>& t_digits);
82 const std::vector<short>& t_digits,
98 bool getMinusSign()
const;
100 void setMinusSign(
bool t_sign);
114 copy.setMinusSign(
false);
121 if (a.exponent < 1) {
122 if (a.getMinusSign())
127 if (a.exponent > a.mantissa.size())
128 nDigits = a.mantissa.size();
129 std::vector<short> digits(a.mantissa.digits.rend()-nDigits,
130 a.mantissa.digits.rend());
131 if (a.getMinusSign()) {
141 if (a.exponent >= a.mantissa.size()) {
142 std::vector<short> digits(a.exponent.toCInteger(), 0);
143 for (
int i = 0; i != a.mantissa.size(); ++i)
144 digits[i] = a.mantissa[i];
153 if (a.exponent >= a.mantissa.size())
155 short firstDigit = a.mantissa[a.exponent.toCInteger()];
156 if (firstDigit > base/2)
162 std::ostream& operator<<(std::ostream& fout, const float_sap<base>& floating)
165 if (floating.getMinusSign())
169 if (f.isScientific()) {
170 fout << convertDigit(floating.mantissa[
171 floating.mantissa.size()-1]) <<
".";
172 for (
size_t i = 1; i != floating.mantissa.size(); ++i)
173 if (i > f.getMaxDigits())
176 fout << floating.mantissa[
177 floating.mantissa.size()-i-1];
178 fout <<
" x " << base <<
"^" << floating.exponent - 1;
182 if (floating.exponent <= 0) {
185 for (
int i = 0; i != abs(floating.exponent.toCInteger()); ++i) {
186 if (i > f.getMaxDigits())
191 if (nDigits > f.getMaxDigits())
193 for (
size_t i = 0; i != floating.mantissa.size(); ++i)
194 if (i + nDigits > f.getMaxDigits())
197 fout << convertDigit(floating.mantissa[
198 floating.mantissa.size()-i-1]);
202 bool floatingPoint =
false;
203 for (
size_t i = 0; i != floating.mantissa.size(); ++i) {
204 if (i == floating.exponent) {
205 floatingPoint =
true;
209 if (nDigits > f.getMaxDigits())
212 fout << convertDigit(floating.mantissa[
213 floating.mantissa.size()-i-1]);
216 fout << convertDigit(floating.mantissa[
217 floating.mantissa.size()-1-i]);
246 if (a.exponent > b.exponent) {
247 diff = (a.exponent - b.exponent
248 - (a.mantissa.size() - b.mantissa.size())).toCInteger();
250 else if (b.exponent > a.exponent) {
251 diff = (b.exponent - a.exponent
252 - (b.mantissa.size() - a.mantissa.size())).toCInteger();
257 a.mantissa.shiftLeft(diff);
259 b.mantissa.shiftLeft(-diff);
261 a.exponent += (newMantissa.size() - a.mantissa.size());
262 a.mantissa = newMantissa;
337 b.setMinusSign(not a.getMinusSign());
370 a.exponent = a.exponent + b.exponent
371 + (newMantissa.size() - a.mantissa.size());
372 a.mantissa = std::move(newMantissa);
381 std::cout <<
"Division by 0 encountered in float_sap<" 386 divide(a.mantissa, b.mantissa, divisor, rest);
389 size_t nDigits = result.mantissa.size();
390 while (rest != 0 and nDigits < PRECISION) {
392 divide(rest, b.mantissa, divisor, rest);
428 divide(a, b, divisor, rest);
476 std::cout <<
"Error: 0^0 is not defined." << std::endl;
479 return 1 / (pow(a, -b));
486 if (totalPow*2 <= b) {
490 else if (totalPow == b)
493 return res *= pow(a, b-totalPow);
513 return (a.exponent == b.exponent) and (a.mantissa == b.mantissa);
535 bool operator<(long long int a, const float_sap<base>& b)
541 bool operator<(const float_sap<base>& a,
long long int b)
543 return a<float_sap<base>(b);
549 if (a.exponent < b.exponent)
551 if (b.exponent < a.exponent)
553 return a.mantissa < b.mantissa;
557 bool operator<=(long long int a, const float_sap<base>& b)
559 return (a<b or a==b);
563 bool operator<=(const float_sap<base>& a,
long long int b)
565 return (a<b or a==b);
571 return (a<b or a==b);
595 return (a>b or a==b);
601 return (a>b or a==b);
607 return (a>b or a==b);
611 template<
size_t base>
619 template<
size_t base>
620 float_sap<base>::float_sap(
long double other)
625 template<
size_t base>
629 exponent = mantissa / base + 1;
632 template<
size_t base>
633 float_sap<base>::float_sap(
const int_ap<base>& t_mantissa,
635 :mantissa(t_mantissa),
641 template<
size_t base>
644 return mantissa.getMinusSign();
647 template<
size_t base>
650 mantissa.setMinusSign(t_sign);
653 template<
size_t base>
656 adjustOnExponent(number.exponent);
659 template<
size_t base>
662 int diff = (exponent - t_exponent).toCInteger();
664 std::cout <<
"Adjusting a float_sap on bigger exponent. No meant to do" 665 <<
" do that." << std::endl;
668 mantissa.shiftLeft(diff);
671 template<
size_t base>
681 *
this = decomposeLongFloat<base>(other);
687 template<
size_t base>
690 mantissa = other.mantissa;
691 exponent = other.exponent;
695 template<
size_t base>
701 template<
size_t base>
704 csl::Formatter::setFormat(f);
Namespace for csl library.
Definition: abreviation.h:34
Definition: precision_int.h:53
Definition: precision_float.h:709
Definition: precision_float.h:63
Definition: precision_float.h:715