My method, first builds an approximation of the solution of `a/b` as...
`s1 = ((a / 2) / b) * 2;
`
`a / 2` is done using the bug-free shift-right operator (`>>`) and results always in a number with bit 64 unset, so we can divide it by `b` without incurring in the convert-to-NV bug. Again multiplying by 2 is done with the shift-left operator (`<<`).
Then, we use the approximation to build the exact solution as:
`s = s1 + (a - s1 * b) / b
`
Well, actually, in order to do everything using bug-free operations, the code uses the following equivalence:
`s2 = (a / 2) / b
s1 = s2 * 2
s = s1 + (a - s1 * b) / b
s = s2 * 2 + (a - (s2 * b) * 2) / b
`
where `$d` is `s2`, and `$e` is `(a - (s2 * b) * 2)`. |
Comment onRe: 64-bit division anomolies (Solved.)DownloadCode