--------------------------------------------------------
 1: static int sqlite3IntFloatCompare(i64 i, double r){
 2:   if( sizeof(LONGDOUBLE_TYPE)>8 ){
 3:     LONGDOUBLE_TYPE x = (LONGDOUBLE_TYPE)i;
 4:     if( x<r ) return -1;
 5:     if( x>r ) return +1;
 6:     return 0;
 7:   }else{
 8:     i64 y;
 9:     double s;
10:     if( r<-9223372036854775808.0 ) return +1;
11:     if( r>9223372036854775807.0 ) return -1;
12:     y = (i64)r;
13:     if( i<y ) return -1;
14:     if( i>y ){
15:       if( y==SMALLEST_INT64 && r>0.0 ) return -1;
16:       return +1;
17:     }
18:     s = (double)i;
19:     if( s<r ) return -1;
20:     if( s>r ) return +1;
21:     return 0;
22:   }
23: }
--------------------------------------------------------

Line 11: the value 9223372036854775807.0 is unrepresentable as a double.
The compiler uses the approximation 9223372036854775808.0,
so the condition is in fact 'if( r>9223372036854775808.0 )'.
Line 12: when r=9223372036854775808.0 then y=SMALLEST_INT64
and this special case is handled by the condition on line 15.

But if the condition in line 11 were 'if( r>=9223372036854775808.0 )'
then for r=9223372036854775808.0 the function would return -1
before assigning r to y, so the condition on line 15 would be unnecessary.
_______________________________________________
sqlite-users mailing list
sqlite-users@mailinglists.sqlite.org
http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users

Reply via email to