#include <stdio.h>
#include <stdint.h>
#include <inttypes.h>

typedef int64_t i64;
const i64 SMALLEST_INT64 = (((i64)(-1)) << 63);
typedef long double LONGDOUBLE_TYPE;

int sqlite3IntFloatCompare1(i64 i, double r){
  /*if( sizeof(LONGDOUBLE_TYPE)>8 ){
    LONGDOUBLE_TYPE x = (LONGDOUBLE_TYPE)i;
    if( x<r ) return -1;
    if( x>r ) return +1;
    return 0;
  }else{*/
    i64 y;
    double s;
    if( r<-9223372036854775808.0 ) return +1;
    if( r>9223372036854775807.0 ) return -1;
    y = (i64)r;
    if( i<y ) return -1;
    if( i>y ){
      if( y==SMALLEST_INT64 && r>0.0 ) return -1;
      return +1;
    }
    s = (double)i;
    if( s<r ) return -1;
    if( s>r ) return +1;
    return 0;
  //}
}

int sqlite3IntFloatCompare2(i64 i, double r){
  /*if( sizeof(LONGDOUBLE_TYPE)>8 ){
    LONGDOUBLE_TYPE x = (LONGDOUBLE_TYPE)i;
    if( x<r ) return -1;
    if( x>r ) return +1;
    return 0;
  }else{*/
    i64 y;
    double s;
    if( r<-9223372036854775808.0 ) return +1;
    if( r>=9223372036854775808.0 ) return -1;
    y = (i64)r;
    if( i<y ) return -1;
    if( i>y ) return +1;
    s = (double)i;
    if( s<r ) return -1;
    if( s>r ) return +1;
    return 0;
  //}
}

int main()
{
	const double td[12] = { 0.0, 0.25, 0.5, 0.75, 1.0, 1.25, 1.5, 1.75, 2.0,
		9223372036854774784.0, 9223372036854775808.0, 9223372036854777856.0 };
	const int64_t ti[10] = { 0, 1, 2, 3, -1, -2, -3,
		0x7FFFFFFFFFFFFFFF, SMALLEST_INT64, (SMALLEST_INT64 + 1) };
	for(int i = 0; i < 12; ++i)
	{
		for(int j = 0; j < 10; ++j)
		{
			const double dTa = td[i];
			const int64_t iT = ti[j];
			for(int k = 0; k < 2; ++k)
			{
				const double dT = (k ? -dTa : dTa);
				const int c1 = sqlite3IntFloatCompare1(iT, dT);
				const int c2 = sqlite3IntFloatCompare2(iT, dT);
				const int ok = (c1 == c2);
				printf("%" PRIi64 " <=> %f -> %d %d %s\n", iT, dT, c1, c2,
					(ok ? "OK" : "<==!ERROR!==>"));
			}
		}
	}
	return 0;
}
