dconv 2.0
C++14 library for printing and parsing floating point numbers
Loading...
Searching...
No Matches
power.hpp
Go to the documentation of this file.
1
25#ifndef __DCONV_POWER_HPP__
26#define __DCONV_POWER_HPP__
27
28// C.
29#include <cstdint>
30
31namespace dconv
32{
33 namespace details
34 {
36 struct Power
37 {
39 uint64_t hi;
40
42 uint64_t lo;
43 };
44
52 inline void umul128 (uint64_t a, uint64_t b, uint64_t& high, uint64_t& low) noexcept
53 {
54#if defined(__SIZEOF_INT128__)
55 __uint128_t p = static_cast<__uint128_t> (a) * b;
56
57 high = static_cast<uint64_t> (p >> 64);
58 low = static_cast<uint64_t> (p);
59#else
60 uint64_t b_lo = static_cast<uint32_t> (b);
61 uint64_t b_hi = b >> 32;
62 uint64_t p0 = (a & 0xFFFFFFFF) * b_lo;
63 uint64_t p1 = (a >> 32) * b_lo;
64 uint64_t p2 = (a & 0xFFFFFFFF) * b_hi;
65 uint64_t p3 = (a >> 32) * b_hi;
66 uint64_t carry = (p0 >> 32) + (p1 & 0xFFFFFFFF) + (p2 & 0xFFFFFFFF);
67
68 low = (carry << 32) | (p0 & 0xFFFFFFFF);
69 high = (carry >> 32) + (p1 >> 32) + (p2 >> 32) + p3;
70#endif
71 }
72 }
73}
74
75#endif
void umul128(uint64_t a, uint64_t b, uint64_t &high, uint64_t &low) noexcept
multiply two 64 bits unsigned integers.
Definition power.hpp:52
Definition atod.hpp:47
128 bits power.
Definition power.hpp:37
uint64_t hi
high 64 bits.
Definition power.hpp:39
uint64_t lo
low 64 bits.
Definition power.hpp:42