52 >-----Original Message----- >From: sqlite-users-boun...@sqlite.org [mailto:sqlite-users- >boun...@sqlite.org] On Behalf Of RSmith >Sent: Wednesday, 24 September, 2014 10:49 >To: sqlite-users@sqlite.org >Subject: [sqlite] Division accuracy > >I'm trying to find what the limit is for dividing in terms of accuracy. > >Basically I have one program that inserts values to a table and determine >sort order using one standard trick that has a REAL column >named "SortOrder" which gets the value Highest_previous_value+1 if an >insert happens with something that needs to be sorted at the >end of the table. > >For any other position, the SortOrder gets assigned the value: >((Prev.Sortorder + Next.Sortorder) / 2) > >So to be clear (in case anyone is not familiar with this method), let's >start with a small table with 1 item added like this: > >ID | SortOrder | Data >1 | 1 | 'First Row' > >Adding two new rows to the end every time will use previous highest >SortOrder+1 so that the result is: > >ID | SortOrder | Data >1 | 1 | 'First Row' >2 | 2 | 'Eventual Fourth Row' >3 | 3 | 'Last Row' > >Adding a new row that should Sort in between IDs 1 and 2 above will take >those SortOrders and find a new Order value by dividing the >total for IDs 1 and 2 (=3) by 2 (=1.5): > >ID | SortOrder | Data >1 | 1 | 'First Row' >2 | 2 | 'Eventual Fourth Row' >3 | 3 | 'Last Row' >4 | 1.5 | 'New Second Row' > >Adding another row that should Sort in between IDs 2 and 4 will again >total and divide by 2 (=(2+1.5)/2): > >ID | SortOrder | Data >1 | 1 | 'First Row' >2 | 2 | 'Eventual Fourth Row' >3 | 3 | 'Last Row' >4 | 1.5 | 'New Second Row' >5 | 1.75| 'New Third Row' > >So that if the Query 'SELECT Data FROM t ORDER BY SortOrder' executes it >goes like this: > >Data >'First Row' >'New Second Row' >'New Third Row' >'Eventual Fourth Row' >'Last Row' > > >This seems like a clever method and I've seen it used a few times, but it >really can break easily if you keep dividing by two, there >is a very quick limit in accuracy where one value can no longer be >divided by two meanigfully. In 64-bit Floating point Math that >limit is very far away, quite a few iterations (assuming normal floating >point mantissa accuracy - the exponent size does not matter >since any two such values will be adjacent in the same realm of magnitude >and only the available real numbers in between them >counts), but if inserts happen 2 to 3 times a second, and imagining for a >moment that the sort might hit the same spot every time, >many consecutive divs might be exhausted quick. > >The question is - how can I accurately establish how many total-then- >divide-by-2's a set of co-values in 64-bit FP guise can >withstand before the difference is too small to make sense to the sorter >in SQLite? > >Reason: The fix is easy but costly on a large DB, sort and reassign >SortOrders simply in Integer steps: 1, 2, 3 etc., but I want to >establish how often this should be done, as little as possible preferred, >but not so little as to allow the order to break or div0 >errors or such. > > > >_______________________________________________ >sqlite-users mailing list >sqlite-users@sqlite.org >http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users
_______________________________________________ sqlite-users mailing list sqlite-users@sqlite.org http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users