From: Volker v. N. <vol...@gm...> - 2014-09-21 16:00:21
|
Am 20.09.2014 22:53, schrieb Raymond Toy: > > Ok. I haven't looked at your code yet, but if they're significantly faster > and not (much) less accurate, we should consider adding these. I'm sure we > can come up with a nice set of tests to cover the code to show that it's > good. > I made some timing measurements and to summarize the results I have to say that these algorithms are only of interest if you want to use precisions of $fpprec > 1000 and (much) higher. In "normal" ranges, i.e. 16 <= $fpprec <= let's say 100, they are generally much slower. The accuracy depends on the binary representation of the argument. A simple argument like 0.5b0 results in slightly better accuracy but e.g. bs_sin(bs_asin(0.5b0)) leads to significantly worse results compared to sin(asin(0.5b0)) . fpprec:30$ x:0.5b0$ asin(x); --> 5.23598775598298873077107230547b−1 bs_asin(x); --> 5.23598775598298873077107230547b−1 sin(asin(x)); --> 5.00000000000000000000000000001b−1 bs_sin(bs_asin(x)); --> 5.00000000000000000023968760547b−1 To merge them into src one has to create precision transition points from the current versions to the binary splitting versions and these transitions will vary from Lisp to Lisp, from 32 to 64 bit and from platform to platform. I am not inclined to open this can of worms. I will put these functions to /share/contrib, so that someone who needs $fpprec > 1000 can use them. Or for someone who wants to look at the implementation details. But nothing more at the moment. My functions have a bug where I need help. In case the return value is a power of 2 and fpround has rounded from below I have the problem to fix the exponent. It seems that I do not understand the mechanism of fpround and *m in float.lisp. Can someone help? Volker van Nek ASIN x:0.5b0$GCL x:0.1b0$GCL x:0.1b0$SBCL fpprec:30$ :lisp (time #$thru 10000 do asin(x)$) real time : 4.909 secs 1.759 secs 1.215 :lisp (time #$thru 10000 do bs_asin(x)$) real time : 4.409 secs 3.840 secs 2.835 fpprec:100$ :lisp (time #$thru 1000 do asin(x)$) real time : 1.490 secs 0.529 secs 0.450 :lisp (time #$thru 1000 do bs_asin(x)$) real time : 0.699 secs 0.740 secs 0.678 fpprec:1000$ :lisp (time #$thru 100 do asin(x)$) real time : 11.149 secs 2.220 secs 6.514 :lisp (time #$thru 100 do bs_asin(x)$) real time : 0.620 secs 0.579 secs 1.228 fpprec:10000$ :lisp (time #$thru 1 do asin(x)$) real time : 23.329 secs 5.619 secs 47.634 :lisp (time #$thru 1 do bs_asin(x)$) real time : 0.150 secs 0.150 secs 1.046 SIN x:0.5b0$GCL x:0.1b0$GCL x:0.1b0$SBCL fpprec:30$ :lisp (time #$thru 10000 do sin(x)$) real time : 1.169 secs 0.990 secs 0.649 :lisp (time #$thru 10000 do bs_sin(x)$) real time : 0.879 secs 2.509 secs 1.569 fpprec:100$ :lisp (time #$thru 1000 do sin(x)$) real time : 0.239 secs 0.200 secs 0.207 :lisp (time #$thru 1000 do bs_sin(x)$) real time : 0.170 secs 0.479 secs 0.389 fpprec:1000$ :lisp (time #$thru 100 do sin(x)$) real time : 0.930 secs 0.910 secs 2.243 :lisp (time #$thru 100 do bs_sin(x)$) real time : 0.140 secs 0.370 secs 0.708 fpprec:10000$ :lisp (time #$thru 1 do sin(x)$) real time : 1.700 secs 1.409 secs 12.167 :lisp (time #$thru 1 do bs_sin(x)$) real time : 0.019 secs 0.079 secs 0.634 EXP x:0.5b0$GCL x:0.1b0$GCL x:0.1b0$SBCL fpprec:30$ :lisp (time #$thru 10000 do exp(x)$) real time : 1.590 secs 1.019 secs 0.796 :lisp (time #$thru 10000 do bs_exp(x)$) real time : 0.370 secs 0.920 secs 0.672 fpprec:100$ :lisp (time #$thru 1000 do exp(x)$) real time : 0.419 secs 0.300 secs 0.311 :lisp (time #$thru 1000 do bs_exp(x)$) real time : 0.059 secs 0.170 secs 0.161 fpprec:1000$ :lisp (time #$thru 100 do exp(x)$) real time : 1.830 secs 1.490 secs 3.820 :lisp (time #$thru 100 do bs_exp(x)$) real time : 0.039 secs 0.150 secs 0.289 fpprec:10000$ :lisp (time #$thru 1 do exp(x)$) real time : 3.430 secs 2.740 secs 23.730 :lisp (time #$thru 1 do bs_exp(x)$) real time : 0.000 secs 0.039 secs 0.272 LOG x:0.5b0$GCL x:0.1b0$GCL x:0.1b0$SBCL :lisp (time #$thru 10000 do log(x)$) real time : 3.269 secs 1.899 secs 1.139 :lisp (time #$thru 10000 do bs_log(x)$) real time : 0.500 secs 1.809 secs 1.227 fpprec:100$ :lisp (time #$thru 1000 do log(x)$) real time : 1.210 secs 0.519 secs 0.549 :lisp (time #$thru 1000 do bs_log(x)$) real time : 0.070 secs 0.289 secs 0.249 fpprec:1000$ :lisp (time #$thru 100 do log(x)$) real time : 6.480 secs 3.099 secs 7.522 :lisp (time #$thru 100 do bs_log(x)$) real time : 0.070 secs 0.250 secs 0.397 fpprec:10000$ :lisp (time #$thru 1 do log(x)$) real time : 12.810 secs 6.360 secs 50.478 :lisp (time #$thru 1 do bs_log(x)$) real time : 0.009 secs 0.050 secs 0.302 |