Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

A proof that fmod() can't be emulated by fast code

11 views
Skip to first unread message

Bonita Montero

unread,
Mar 11, 2023, 3:54:22 PM3/11/23
to

#include <iostream>
#include <bit>
#include <cmath>
#include <random>
#include <algorithm>

using namespace std;

int main()
{
constexpr size_t N = 1'000'000;
mt19937_64 mt;
uniform_int_distribution<uint64_t> uidBinDoubles( 0, 0x7FFFFFFFFFFFFFF );
size_t succ = 0, fail = 0;
for( size_t i = 0; i != N; ++i )
{
auto gen = [&]() -> double { return bit_cast<double>( uidBinDoubles(
mt ) ); };
double ctr = gen(), denom = gen();
double
fmodResult = fmod( ctr, denom ),
divModResult = ctr - trunc( ctr / denom ) * denom;
auto bin = []( double d ) -> uint64_t { return bit_cast<uint64_t>( d ); };
++(bin( fmodResult ) == bin( divModResult ) ? succ : fail);
}
cout << "succ: " << succ << endl;
cout << "fail: " << fail << endl;
}

X-Post to clc because fmod() itself is a C-function.
0 new messages