https://gcc.gnu.org/bugzilla/show_bug.cgi?id=95286
Bug ID: 95286
Summary: -march=native causes mt19937_64 +
uniform_real_distribution generating wrong result.
Product: gcc
Version: 11.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c++
Assignee: unassigned at gcc dot gnu.org
Reporter: euloanty at live dot com
Target Milestone: ---
#include<random>
#include<iostream>
int main()
{
std::mt19937_64 eng;
std::uniform_real_distribution dis(-10000.0f,10000.0f);
float v{};
for(std::size_t i(0);i!=36;++i)
v=dis(eng);
static_assert(sizeof(float)==sizeof(std::uint32_t));
std::uint32_t puned;
memcpy(std::addressof(puned),std::addressof(v),sizeof(std::uint32_t));
std::cout<<puned<<'\n';
}
First one is correct I believe since MSVC also generates the same result.
D:\hg\fast_io\helpers\fp>g++ -o dontagree dontagree.cc -Ofast -std=c++20 -s
-Ofast
D:\hg\fast_io\helpers\fp>dontagree
3298476032
D:\hg\fast_io\helpers\fp>g++ -o dontagree dontagree.cc -Ofast -std=c++20 -s
-march=native
D:\hg\fast_io\helpers\fp>dontagree
3298476035
I test the same thing under Linux. Same problem here.