Introduction:
compare is a c++ program to compare two double numbers when insignificant bits not considered.
Code:
Download compare.cpp
/****************************************************************************
compare is a c++ program to compare two double numbers
when insignificant bits not considered.
by Hamid Soltani. (gmail: hsoltanim)
https://csvparser.github.io/
Last modified: Sep. 2016.
*****************************************************************************/
#include "stdafx.h"
#include < bitset >
#include < iostream >
#include < math.h >
using namespace std;
#define unImpBits 4
#define bitsTol (1 << unImpBits)
#define almostZero (bitsTol << 1)
union bits64 {
double x;
unsigned long long i;
};
double rounded(double r)
{
bits64 v;
v.x = r;
v.i = (v.i + (1 << (unImpBits - 1))) >> unImpBits << unImpBits;
return v.x;
}
bool isequal(double a, double b)
{
bits64 mx;
bits64 mn;
mx.x = a;
mn.x = b;
if (mx.i < mn.i)
{
mx.x = b;
mn.x = a;
}
// Check if it is zero not considering insignificant bits
if ((mx.i << 1) < almostZero)
return ((mn.i << 1) < almostZero);
return (mx.i < mn.i + bitsTol);
}
int main()
{
double a = -4;
double b = -100 / sqrt(5) / sqrt(5) / sqrt(5) / sqrt(5);
// a = 0.0; b = -0.0;
bits64 _a, _b;
_a.x = a;
_b.x = b;
bitset<64> __a = _a.i;
bitset<64> __b = _b.i;
cout << " a: " << __a << "\n b: " << __b << "\n" << "\n";
_a.x = rounded(a);
_b.x = rounded(b);
__a = _a.i;
__b = _b.i;
cout << "Rounded a: " << __a << "\nRounded b: " << __b << "\n" << "\n";
cout << "Comparing a, b:\n";
cout << "All bits considered: "
<< ((a == b) ? "Eqaul" : "Not equal") << endl;
cout << unImpBits << " insignificant bits not considered: "
<< (isequal(a, b) ? "Eqaul" : "Not equal") << endl;
cout << "Rounded to " << unImpBits << " bits: "
<< ((rounded(a) == rounded(b)) ? "Eqaul" : "Not equal") << endl;
cout << "Press Enter to exit...\n";
getchar();
return 0;
}