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:
parent
dcabfcee27
commit
e025d1d7e5
12
manifest
12
manifest
@ -1,5 +1,5 @@
|
||||
C Changes\sto\sinternal\sAtoF\sto\simprove\s"accuracy"\swhen\smeasured\sagainst\sbuilt-in\sGCC\satof().
|
||||
D 2009-09-07T02:46:32
|
||||
C Attempt\sto\shandle\snumbers\sat\sthe\slimits\sof\sthe\sIEEE\s754\srange\sbetter\s(nan.test\snow\spasses).
|
||||
D 2009-09-07T03:48:53
|
||||
F Makefile.arm-wince-mingw32ce-gcc fcd5e9cd67fe88836360bb4f9ef4cb7f8e2fb5a0
|
||||
F Makefile.in 73ddeec9dd10b85876c5c2ce1fdce627e1dcc7f8
|
||||
F Makefile.linux-gcc d53183f4aa6a9192d249731c90dbdffbd2c68654
|
||||
@ -203,7 +203,7 @@ F src/tokenize.c af8a56e6a50c5042fc305bfa796275e9bf26ff2b
|
||||
F src/trigger.c 8158237fc5fa4b51a126a294791729c64d27a0a9
|
||||
F src/update.c 12ffd68c2f241c730d5e051eb29b23e90682ff8a
|
||||
F src/utf.c 3ca2c9461b8e942c68da28bfccd448663f536a6f
|
||||
F src/util.c 7404ac078125aafc0e274b2d1a918c3f15b50294
|
||||
F src/util.c 59d4e9456bf1fe581f415a783fa0cee6115c8f35
|
||||
F src/vacuum.c 3fe0eebea6d2311c1c2ab2962887d11f7a4dcfb0
|
||||
F src/vdbe.c addf5f6fefe9b9c6ca8819efbf52cfce8bd68089
|
||||
F src/vdbe.h 080fe6bc1264438becb8bf9b9f3c84074c336b78
|
||||
@ -750,7 +750,7 @@ F tool/speedtest2.tcl ee2149167303ba8e95af97873c575c3e0fab58ff
|
||||
F tool/speedtest8.c 2902c46588c40b55661e471d7a86e4dd71a18224
|
||||
F tool/speedtest8inst1.c 293327bc76823f473684d589a8160bde1f52c14e
|
||||
F tool/vdbe-compress.tcl d70ea6d8a19e3571d7ab8c9b75cba86d1173ff0f
|
||||
P 2aeab80e5b84f5e94c5c99b4adeca805601c844b
|
||||
R 0b92cbb9074dfe690c0e4c14e6998bde
|
||||
P 438e1577d0f9ceb2851ee0df0df18f0229eca491
|
||||
R c2daf7f44258efdd4b9472e2943bb165
|
||||
U shane
|
||||
Z 82d0c356acbda85944f3ae28efe12d94
|
||||
Z 2480ce6a3608c9caf8089d33acaa4dae
|
||||
|
@ -1 +1 @@
|
||||
438e1577d0f9ceb2851ee0df0df18f0229eca491
|
||||
2a74ae1969aeec93576a44e11177677e6f3cea9c
|
26
src/util.c
26
src/util.c
@ -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;
|
||||
|
Loading…
x
Reference in New Issue
Block a user