#include <chrono>
#include <iostream>
#include <cmath>
class TimeMeasure {
public:
TimeMeasure() {
start();
}
void start() {
m_start = now();
}
int elapsed_ms() const {
return elapsed< std::chrono::milliseconds >();
}
int elapsed_mks() const {
return elapsed< std::chrono::microseconds >();
}
private:
template< class D >
int elapsed() const {
return std::chrono::duration_cast< D >( now() - m_start ).count();
}
const std::chrono::system_clock::time_point now() const {
return std::chrono::system_clock::now();
}
std::chrono::system_clock::time_point m_start;
};
template< class F >
void measure_ms( const char * const text, F f ) {
TimeMeasure m;
f();
int t = m.elapsed_ms();
std::cout << text << " : " << t << " ms." << std::endl;
}
template< class F >
void measure_mks( const char * const text, F f ) {
TimeMeasure m;
f();
int t = m.elapsed_mks();
std::cout << text << " : " << t << " mks." << std::endl;
}
const int times = 1000000;
double MODF()
{
double param, fractpart, intpart;
for( int i=0; i<times; ++i )
{
param = rand();
fractpart = modf (param , &intpart);
}
return intpart;
}
double MODF_CASTAWAY()
{
double param, fractpart, intpart;
for( int i=0; i<times; ++i )
{
param = rand();
intpart = (int)floor( param );
fractpart = (int)((param - intpart));
}
return intpart;
}
int main()
{
measure_mks( "modf_castaway", MODF_CASTAWAY );
measure_mks( "modf", MODF );
}
I2luY2x1ZGUgPGNocm9ubz4KI2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8Y21hdGg+CgpjbGFzcyBUaW1lTWVhc3VyZSB7CnB1YmxpYzoKICAgVGltZU1lYXN1cmUoKSB7CiAgICAgIHN0YXJ0KCk7CiAgIH0KICAgdm9pZCBzdGFydCgpIHsKICAgICAgbV9zdGFydCA9IG5vdygpOwogICB9CiAgIGludCBlbGFwc2VkX21zKCkgY29uc3QgewogICAgICByZXR1cm4gZWxhcHNlZDwgc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcyA+KCk7CiAgIH0KICAgaW50IGVsYXBzZWRfbWtzKCkgY29uc3QgewogICAgICByZXR1cm4gZWxhcHNlZDwgc3RkOjpjaHJvbm86Om1pY3Jvc2Vjb25kcyA+KCk7CiAgIH0KCnByaXZhdGU6CiAgIHRlbXBsYXRlPCBjbGFzcyBEID4KICAgaW50IGVsYXBzZWQoKSBjb25zdCB7CiAgICAgIHJldHVybiBzdGQ6OmNocm9ubzo6ZHVyYXRpb25fY2FzdDwgRCA+KCBub3coKSAtIG1fc3RhcnQgKS5jb3VudCgpOwogICB9CiAgIGNvbnN0IHN0ZDo6Y2hyb25vOjpzeXN0ZW1fY2xvY2s6OnRpbWVfcG9pbnQgbm93KCkgY29uc3QgewogICAgICByZXR1cm4gc3RkOjpjaHJvbm86OnN5c3RlbV9jbG9jazo6bm93KCk7CiAgIH0KICAgc3RkOjpjaHJvbm86OnN5c3RlbV9jbG9jazo6dGltZV9wb2ludCBtX3N0YXJ0Owp9OwoKdGVtcGxhdGU8IGNsYXNzIEYgPgp2b2lkIG1lYXN1cmVfbXMoIGNvbnN0IGNoYXIgKiBjb25zdCB0ZXh0LCBGIGYgKSB7CiAgIFRpbWVNZWFzdXJlIG07CiAgIGYoKTsKICAgaW50IHQgPSBtLmVsYXBzZWRfbXMoKTsKICAgc3RkOjpjb3V0IDw8IHRleHQgPDwgIiA6ICIgPDwgdCA8PCAiIG1zLiIgPDwgc3RkOjplbmRsOwp9Cgp0ZW1wbGF0ZTwgY2xhc3MgRiA+CnZvaWQgbWVhc3VyZV9ta3MoIGNvbnN0IGNoYXIgKiBjb25zdCB0ZXh0LCBGIGYgKSB7CiAgIFRpbWVNZWFzdXJlIG07CiAgIGYoKTsKICAgaW50IHQgPSBtLmVsYXBzZWRfbWtzKCk7CiAgIHN0ZDo6Y291dCA8PCB0ZXh0IDw8ICIgOiAiIDw8IHQgPDwgIiBta3MuIiA8PCBzdGQ6OmVuZGw7Cn0KCmNvbnN0IGludCB0aW1lcyA9IDEwMDAwMDA7Cgpkb3VibGUgTU9ERigpCnsKIAlkb3VibGUgcGFyYW0sIGZyYWN0cGFydCwgaW50cGFydDsJCglmb3IoIGludCBpPTA7IGk8dGltZXM7ICsraSApCgl7CgkgIAlwYXJhbSA9IHJhbmQoKTsKCQlmcmFjdHBhcnQgPSBtb2RmIChwYXJhbSAsICZpbnRwYXJ0KTsKCX0KCXJldHVybiBpbnRwYXJ0Owp9Cgpkb3VibGUgTU9ERl9DQVNUQVdBWSgpCnsKCWRvdWJsZSBwYXJhbSwgZnJhY3RwYXJ0LCBpbnRwYXJ0OwkKCWZvciggaW50IGk9MDsgaTx0aW1lczsgKytpICkKCXsKCSAgCXBhcmFtID0gcmFuZCgpOwoJCWludHBhcnQgPSAoaW50KWZsb29yKCBwYXJhbSApOwoJCWZyYWN0cGFydCA9IChpbnQpKChwYXJhbSAtIGludHBhcnQpKTsKCX0KCXJldHVybiBpbnRwYXJ0OwkKfQoKaW50IG1haW4oKQp7CgltZWFzdXJlX21rcyggIm1vZGZfY2FzdGF3YXkiLCBNT0RGX0NBU1RBV0FZICk7CgltZWFzdXJlX21rcyggIm1vZGYiLCBNT0RGICk7CQp9Cg==