Modify

Ticket #12627 (closed Bugs: fixed)

Opened 5 months ago

Last modified 5 months ago

export_bits() gives wrong answer on fixed precision type

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

Description

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                   
FEDCBA9876543210F1E2D3C4B5A69788
f1e2d3c4b5a69788f1e2d3c4b5a69788
➜  ~ 

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

Change History

comment:1 Changed 5 months ago by johnmaddock

  • Status changed from new to closed
  • Resolution set to fixed

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

Fixed in https://github.com/boostorg/multiprecision/commit/fe3eac52bfb050e3751edb045e6dd4fa52645bd8

View

Add a comment

Modify Ticket

Change Properties
<Author field>
Action
as closed
The resolution will be deleted. Next status will be 'reopened'
Author


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

 
Note: See TracTickets for help on using tickets.