#include <stdio.h>
#include <iostream>
#include <random>
using namespace std;
bool a_GE_b(float a, float b);
void compare_non_negative_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_non_negative_float();
//show_details();
return 0;
}
void compare_non_negative_float(){
std::random_device rd;
std::default_random_engine eng(rd());
std::uniform_real_distribution<float> distr(FLOAT_MIN, FLOAT_MAX);
float a, b;
for(unsigned i=0; i<-1; i++){
if(i%100000000==0) cout<<i<<endl;
a = distr(eng);
b = distr(eng);
if(a_GE_b(a, b)){// treat a>=b as ( a>b shows true )
if(a<b) cout<<"Error: "<<a <<">="<<b<<" is wrong."<<endl;
}else{
if(a>=b) cout<<"Error: "<<a <<"<"<<b <<" is wrong."<<endl;
}
}
}
bool a_GE_b(float a, float b){//if a==b, return a>b this is true
union float_int_type a1, b1;
a1.m_float = a;
b1.m_float = b;
unsigned a_ex = a1.m_exponent;// define these four global
unsigned b_ex = b1.m_exponent;
unsigned a_si = a1.m_significand;
unsigned b_si = b1.m_significand;
if(a_ex>b_ex){
return true;
}else if(a_ex<b_ex){
return false;
}else{//a_ex == b_ex
if(a_si < b_si){
return false;
}//else{ return true; }
}
return true;
}
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;
}
unsigned int *i_ptr;
float x = 1.0f;
unsigned int scalar_y =0;
i_ptr = (int*)&x;
scalar_y = *i_ptr;