#12627 closed Bugs (fixed)

export_bits() gives wrong answer on fixed precision type

Reported by: John Galbraith <john.galbraith17@…> Owned by: John Maddock
Milestone: To Be Determined Component: multiprecision
Version: Boost 1.62.0 Severity: Problem
Keywords: Cc:


The following minimal working example prints the wrong answer. Compiled on Ubuntu 16.04, and the console prints:

➜  ~ clang++ -std=c++14 bug.cpp
➜  ~ ./a.out                   
➜  ~ 

I think those numbers should be the same, and they are different. It behaves like the low order 64 bits got serialized twice, and the high order 64 bits never got serialized at all.

If you change the number type from uint128_t to cpp_int, then the example runs fine which is why I think this problem occurs only with fixed precision types.

#include <boost/multiprecision/cpp_int.hpp>
#include <iostream>
#include <vector>
#include <cstdint>
namespace mp = boost::multiprecision;

int main() {
    mp::uint128_t i = mp::uint128_t(0xFEDCBA9876543210) << 64 | 0xF1E2D3C4B5A69788;
    std::cout << std::hex << i << std::endl;
    std::vector<std::uint8_t> v(16);
    export_bits(i, v.begin(), 8);
    std::for_each(v.begin(), v.end(), [](std::uint8_t byte) { std::cout << (int)byte; });
    std::cout << std::endl;

Attachments (0)

Change History (1)

comment:1 Changed 16 months ago by John Maddock

Resolution: fixed
Status: newclosed

Confirmed: it's specific to 128-bit and less types that use int128 internally.

Fixed in

Modify Ticket

Change Properties
Set your email in Preferences
as closed The owner will remain John Maddock.
The resolution will be deleted.

Add Comment

E-mail address and name can be saved in the Preferences.

Note: See TracTickets for help on using tickets.