4#ifndef DUNE_BIGUNSIGNEDINT_HH
5#define DUNE_BIGUNSIGNEDINT_HH
46 struct numeric_limits_helper
51 static std::uint16_t& digit(T& big_unsigned_int, std::size_t i)
53 return big_unsigned_int.digit[i];
74 enum { bits=std::numeric_limits<std::uint16_t>::digits, n=k/bits+(k%bits!=0),
75 hexdigits=4, bitmask=0xFFFF, compbitmask=0xFFFF0000,
82 template<
typename Signed>
83 bigunsignedint (Signed x,
typename std::enable_if<std::is_integral<Signed>::value && std::is_signed<Signed>::value>::type* = 0);
89 void print (std::ostream& s)
const ;
155 std::uint_least32_t
touint()
const;
168 return hash_range(arg.digit,arg.digit + arg.n);
172 std::uint16_t digit[n];
176 inline void assign(std::uintmax_t x);
189 template<
typename Signed>
205 static const int no=std::min(
static_cast<int>(n),
206 static_cast<int>(std::numeric_limits<std::uintmax_t>::digits/bits));
208 for(
int i=0; i<no; ++i) {
209 digit[i] = (x&bitmask);
212 for (
unsigned int i=no; i<n; i++) digit[i]=0;
219 return (digit[1]<<bits)+digit[0];
225 int firstInZeroRange=n;
226 for(
int i=n-1; i>=0; --i)
231 int representableDigits=std::numeric_limits<double>::digits/bits;
232 int lastInRepresentableRange=0;
233 if(representableDigits<firstInZeroRange)
234 lastInRepresentableRange=firstInZeroRange-representableDigits;
236 for(
int i=firstInZeroRange-1; i>=lastInRepresentableRange; --i)
237 val =val*(1<<bits)+digit[i];
238 return val*(1<<(bits*lastInRepresentableRange));
247 for (
int i=n-1; i>=0; i--)
248 for (
int d=hexdigits-1; d>=0; d--)
251 int current = (digit[i]>>(d*4))&0xF;
255 s << std::hex << current;
258 else if (!leading) s << std::hex << current;
260 if (leading) s <<
"0";
277 std::uint_fast32_t overflow=0;
279 for (
unsigned int i=0; i<n; i++)
281 std::uint_fast32_t sum =
static_cast<std::uint_fast32_t
>(digit[i]) +
static_cast<std::uint_fast32_t
>(x.digit[i]) + overflow;
282 result.digit[i] = sum&bitmask;
283 overflow = (sum>>bits)&overflowmask;
292 std::int_fast32_t overflow=0;
294 for (
unsigned int i=0; i<n; i++)
296 std::int_fast32_t diff =
static_cast<std::int_fast32_t
>(digit[i]) -
static_cast<std::int_fast32_t
>(x.digit[i]) - overflow;
299 result.digit[i] =
static_cast<std::uint16_t
>(diff);
304 result.digit[i] =
static_cast<std::uint16_t
>(diff+bitmask+1);
316 for (
unsigned int m=0; m<n; m++)
319 std::uint_fast32_t overflow(0);
320 for (
unsigned int i=0; i<n; i++)
322 std::uint_fast32_t digitproduct =
static_cast<std::uint_fast32_t
>(digit[i])*
static_cast<std::uint_fast32_t
>(x.digit[m])+overflow;
323 singleproduct.digit[i+m] =
static_cast<std::uint16_t
>(digitproduct&bitmask);
324 overflow = (digitproduct>>bits)&bitmask;
326 finalproduct = finalproduct+singleproduct;
330 for (
unsigned int i=0; i<n; i++) result.digit[i] = finalproduct.digit[i];
337 std::uint_fast32_t overflow=1;
339 for (
unsigned int i=0; i<n; i++)
341 std::uint_fast32_t sum =
static_cast<std::uint_fast32_t
>(digit[i]) + overflow;
342 digit[i] = sum&bitmask;
343 overflow = (sum>>bits)&overflowmask;
386 for (
unsigned int i=0; i<n; i++)
387 result.digit[i] = digit[i]&x.digit[i];
395 for (
unsigned int i=0; i<n; i++)
396 result.digit[i] = digit[i]^x.digit[i];
404 for (
unsigned int i=0; i<n; i++)
405 result.digit[i] = digit[i]|x.digit[i];
413 for (
unsigned int i=0; i<n; i++)
414 result.digit[i] = ~digit[i];
425 for (
int i=n-1-j; i>=0; i--)
426 result.digit[i+j] = digit[i];
430 for (
int i=n-1; i>=0; i--)
432 unsigned int temp = result.digit[i];
434 result.digit[i] =
static_cast<std::uint16_t
>(temp&bitmask);
437 result.digit[i+1] = result.digit[i+1]|temp;
450 for (
unsigned int i=0; i<n-j; i++)
451 result.digit[i] = digit[i+j];
455 for (
unsigned int i=0; i<n; i++)
457 std::uint_fast32_t temp = result.digit[i];
458 temp = temp<<(bits-j);
459 result.digit[i] =
static_cast<std::uint16_t
>((temp&compbitmask)>>bits);
461 result.digit[i-1] = result.digit[i-1] | (temp&bitmask);
470 for (
unsigned int i=0; i<n; i++)
471 if (digit[i]!=x.digit[i])
return true;
478 return !((*this)!=x);
484 for (
int i=n-1; i>=0; i--)
485 if (digit[i]<x.digit[i])
return true;
486 else if (digit[i]>x.digit[i])
return false;
493 for (
int i=n-1; i>=0; i--)
494 if (digit[i]<x.digit[i])
return true;
495 else if (digit[i]>x.digit[i])
return false;
502 return !((*this)<=x);
520 inline bigunsignedint<k> operator- (
const bigunsignedint<k>& x, std::uintmax_t y)
522 bigunsignedint<k> temp(y);
527 inline bigunsignedint<k> operator* (
const bigunsignedint<k>& x, std::uintmax_t y)
529 bigunsignedint<k> temp(y);
534 inline bigunsignedint<k> operator/ (
const bigunsignedint<k>& x, std::uintmax_t y)
536 bigunsignedint<k> temp(y);
541 inline bigunsignedint<k> operator% (
const bigunsignedint<k>& x, std::uintmax_t y)
543 bigunsignedint<k> temp(y);
548 inline bigunsignedint<k> operator+ (std::uintmax_t x,
const bigunsignedint<k>& y)
550 bigunsignedint<k> temp(x);
555 inline bigunsignedint<k> operator- (std::uintmax_t x,
const bigunsignedint<k>& y)
557 bigunsignedint<k> temp(x);
562 inline bigunsignedint<k> operator* (std::uintmax_t x,
const bigunsignedint<k>& y)
564 bigunsignedint<k> temp(x);
569 inline bigunsignedint<k> operator/ (std::uintmax_t x,
const bigunsignedint<k>& y)
571 bigunsignedint<k> temp(x);
576 inline bigunsignedint<k> operator% (std::uintmax_t x,
const bigunsignedint<k>& y)
578 bigunsignedint<k> temp(x);
589 struct numeric_limits<
Dune::bigunsignedint<k> >
590 :
private Dune::numeric_limits_helper<Dune::bigunsignedint<k> >
593 static const bool is_specialized =
true;
603 for(std::size_t i=0; i < Dune::bigunsignedint<k>::n; ++i)
606 digit(max_,i)=std::numeric_limits<std::uint16_t>::max();
613 static const bool is_signed =
false;
614 static const bool is_integer =
true;
615 static const bool is_exact =
true;
616 static const int radix = 2;
628 static const int min_exponent = 0;
629 static const int min_exponent10 = 0;
630 static const int max_exponent = 0;
631 static const int max_exponent10 = 0;
633 static const bool has_infinity =
false;
634 static const bool has_quiet_NaN =
false;
635 static const bool has_signaling_NaN =
false;
637 static const float_denorm_style has_denorm = denorm_absent;
638 static const bool has_denorm_loss =
false;
660 static const bool is_iec559 =
false;
661 static const bool is_bounded =
true;
662 static const bool is_modulo =
true;
664 static const bool traps =
false;
665 static const bool tinyness_before =
false;
666 static const float_round_style round_style = round_toward_zero;
Base class for Dune-Exceptions.
Definition: exceptions.hh:91
Default exception class for mathematical errors.
Definition: exceptions.hh:266
Portable very large unsigned integers.
Definition: bigunsignedint.hh:70
A few common exception classes.
bigunsignedint< k > operator|(const bigunsignedint< k > &x) const
bitwise or
Definition: bigunsignedint.hh:401
bigunsignedint< k > operator<<(int i) const
left shift1/
Definition: bigunsignedint.hh:419
bool operator<=(const bigunsignedint< k > &x) const
less than or equal
Definition: bigunsignedint.hh:491
bigunsignedint< k > operator^(const bigunsignedint< k > &x) const
bitwise exor
Definition: bigunsignedint.hh:392
void print(std::ostream &s) const
Print number in hex notation.
Definition: bigunsignedint.hh:242
bigunsignedint< k > operator*(const bigunsignedint< k > &x) const
multiply
Definition: bigunsignedint.hh:312
bool operator<(const bigunsignedint< k > &x) const
less than
Definition: bigunsignedint.hh:482
bool operator==(const bigunsignedint< k > &x) const
equal
Definition: bigunsignedint.hh:476
bool operator!=(const bigunsignedint< k > &x) const
not equal
Definition: bigunsignedint.hh:468
bigunsignedint< k > operator%(const bigunsignedint< k > &x) const
Definition: bigunsignedint.hh:368
bigunsignedint()
Construct uninitialized.
Definition: bigunsignedint.hh:183
bool operator>=(const bigunsignedint< k > &x) const
greater or equal
Definition: bigunsignedint.hh:506
std::ostream & operator<<(std::ostream &s, const array< T, N > &e)
Output operator for array.
Definition: array.hh:26
bigunsignedint< k > operator>>(int i) const
right shift
Definition: bigunsignedint.hh:444
bigunsignedint< k > operator~() const
bitwise komplement
Definition: bigunsignedint.hh:410
bigunsignedint< k > operator-(const bigunsignedint< k > &x) const
subtract
Definition: bigunsignedint.hh:289
bigunsignedint< k > & operator++()
prefix increment
Definition: bigunsignedint.hh:335
double todouble() const
Convert to a double.
Definition: bigunsignedint.hh:223
bigunsignedint< k > operator&(const bigunsignedint< k > &x) const
bitwise and
Definition: bigunsignedint.hh:383
bigunsignedint< k > operator/(const bigunsignedint< k > &x) const
Definition: bigunsignedint.hh:349
bigunsignedint< k > operator+(const bigunsignedint< k > &x) const
add
Definition: bigunsignedint.hh:274
bool operator>(const bigunsignedint< k > &x) const
greater than
Definition: bigunsignedint.hh:500
std::uint_least32_t touint() const
export to other types
Definition: bigunsignedint.hh:217
#define DUNE_THROW(E, m)
Definition: exceptions.hh:243
Support for calculating hash values of objects.
#define DUNE_DEFINE_HASH(template_args, type)
Defines the required struct specialization to make type hashable via Dune::hash.
Definition: hash.hh:98
#define DUNE_HASH_TYPE(...)
Wrapper macro for the type to be hashed in DUNE_DEFINE_HASH.
Definition: hash.hh:115
#define DUNE_HASH_TEMPLATE_ARGS(...)
Wrapper macro for the template arguments in DUNE_DEFINE_HASH.
Definition: hash.hh:107
Dune namespace.
Definition: alignment.hh:10
std::size_t hash_range(It first, It last)
Hashes all elements in the range [first,last) and returns the combined hash.
Definition: hash.hh:309
A traits class describing the mapping of types onto MPI_Datatypes.
Definition: mpitraits.hh:37