#include <stdio.h>
#include <iostream>
#include <random>
using namespace std;
void compare_unnegative_float();
void show_details();
union float_int_type{
unsigned m_unsigned;
float m_float;
struct{
unsigned m_significand : 23;
unsigned m_exponent : 8;
bool m_sign : 1;
};
};
constexpr int FLOAT_MIN = 0;
constexpr int FLOAT_MAX = 10;
int main(){
union float_int_type x, y;
x.m_float = 0.0f;
printf("%x, %f, %u, %u, %u\n",x.m_unsigned, x.m_float, x.m_significand, x.m_exponent, x.m_sign);
cout << x.m_float <<": exponent="<<x.m_exponent<<" significand="<<x.m_significand<<endl;
std::random_device rd;
std::default_random_engine eng(rd());
std::uniform_real_distribution<float> distr(FLOAT_MIN, FLOAT_MAX);
compare_unnegative_float();
//show_details();
return 0;
}
void compare_non_negative_float(){
union float_int_type x, y;
x.m_float = 0.0f;
printf("%x, %f, %u, %u, %u\n",x.m_unsigned, x.m_float, x.m_significand, x.m_exponent, x.m_sign);
cout << x.m_float <<": exponent="<<x.m_exponent<<" significand="<<x.m_significand<<endl;
std::random_device rd;
std::default_random_engine eng(rd());
std::uniform_real_distribution<float> distr(FLOAT_MIN, FLOAT_MAX);
for(unsigned i=0; i<-1; i++){
if(i%10000000==0) cout<<i<<endl;
x.m_float = distr(eng);
y.m_float = distr(eng);
if(x.m_exponent>y.m_exponent || (x.m_exponent==y.m_exponent && x.m_significand>y.m_significand))
{
if(!(x.m_float> y.m_float)) cout<<"Error: "<<x.m_float<<" > "<<y.m_float<<" is false!"<<endl;
}else if(x.m_exponent < y.m_exponent || (x.m_exponent == y.m_exponent && x.m_significand<y.m_significand))
{
if(!(x.m_float < y.m_float)) cout<<"Error: "<<x.m_float<<" < "<<y.m_float<<" is false!"<<endl;
}else
{
if(!(x.m_float == y.m_float)) cout<<"Error: "<<x.m_float<<" == "<<y.m_float<<" is false!"<<endl;
}
}
}
void show_details(){
union float_int_type x;
x.m_float = 1.0f;
printf("%x, %f, %u, %u, %u\n",x.m_unsigned, x.m_float, x.m_significand, x.m_exponent, x.m_sign);
cout << x.m_float <<": exponent="<<x.m_exponent<<" significand="<<x.m_significand<<endl;
std::random_device rd;
std::default_random_engine eng(rd());
std::uniform_real_distribution<float> distr(FLOAT_MIN, FLOAT_MAX);
for(int i=0; i<100; i++){
if(i%10==0) cout<<endl;
x.m_float = distr(eng);
cout << x.m_float <<": exponent="<<x.m_exponent<<" significand="<<x.m_significand<<endl;
}
cout <<endl;
}