Some test: https://ideone.com/zkHHty


2018-05-18 13:36 GMT+02:00, Abroży Nieprzełoży
<abrozynieprzelozy314...@gmail.com>:
> --------------------------------------------------------
>  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