1
0
mirror of https://github.com/sqlite/sqlite.git synced 2025-11-09 14:21:03 +03:00

Attempt to handle numbers at the limits of the IEEE 754 range better (nan.test now passes).

FossilOrigin-Name: 2a74ae1969aeec93576a44e11177677e6f3cea9c
This commit is contained in:
shane
2009-09-07 03:48:52 +00:00
parent dcabfcee27
commit e025d1d7e5
3 changed files with 26 additions and 14 deletions

View File

@@ -375,14 +375,26 @@ int sqlite3AtoF(const char *z, double *pResult){
** and store in result. */
if( e ){
double scale = 1.0;
/* 1.0e+22 is the largest power of 10 than can be
** represented exactly. */
while( e%22 ) { scale *= 1.0e+1; e -= 1; }
while( e>0 ) { scale *= 1.0e+22; e -= 22; }
if( esign<0 ){
result = s / scale;
/* attempt to handle extremely small/large numbers better */
if( e>307 && e<342 ){
while( e%308 ) { scale *= 1.0e+1; e -= 1; }
if( esign<0 ){
result = s / scale;
result /= 1.0e+308;
}else{
result = s * scale;
result *= 1.0e+308;
}
}else{
result = s * scale;
/* 1.0e+22 is the largest power of 10 than can be
** represented exactly. */
while( e%22 ) { scale *= 1.0e+1; e -= 1; }
while( e>0 ) { scale *= 1.0e+22; e -= 22; }
if( esign<0 ){
result = s / scale;
}else{
result = s * scale;
}
}
} else {
result = (double)s;