Re: Accuracy of Mathematical Functions
- Reply: Alexander Leidinger : "Re: Accuracy of Mathematical Functions"
- In reply to: Alexander Leidinger : "Re: Accuracy of Mathematical Functions"
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Tue, 26 Sep 2023 18:08:04 UTC
On Tue, Sep 26, 2023 at 03:26:16PM +0200, Alexander Leidinger wrote: > Am 2023-09-25 15:50, schrieb Paul Zimmermann: > > > We have updated our comparison: > > > > https://members.loria.fr/PZimmermann/papers/accuracy.pdf > > > > This new update includes for the first time the FreeBSD math library, > > whose accuracy is quite good, except: > > I wonder how those functions/libs you tested compare in terms of speed... > It would allow to provide a hint to the question > "Which lib is the fastest and fulfills the needs in terms of accuracy for > the intended use-case?" > > I agree that the best way to do this requires to run all libs on the same > hardware and OS, which is not feasible in your approach. What may be > feasible is to compare the relative performance of those subsets, which you > run on the same hardware. > Speed vs accuracy is always a trade-off. Consider % ./tlibm j0 -f -x 0x1p-9 -X 2 -s 1 -N 4 Interval tested for j0f: [0.00195312,2] 4000000 calls, 0.040901 secs, 0.01023 usecs/call % ./tlibm j0 -f -x 0x1p-9 -X 2 -s 1 -N 4 Interval tested for j0f: [0.00195312,2] 4000000 calls, 0.092471 secs, 0.02312 usecs/call The former timing is for FreeBSD libm on an AMD FX-8350 using only -O2 optimization. The latter is a patched libm, which uses -O2 -funroll-loops -march=bdver2, and is twice as slow! The difference lies in accuracy. The former gives % ./tlibm j0 -f -x 0x1p-9 -X 2 -PD -N 4 Interval tested for j0f: [0.00195312,2] ulp <= 0.5: 85.04% 3401545 | 85.039% 3401545 0.5 < ulp < 0.6: 5.376% 215028 | 90.414% 3616573 0.6 < ulp < 0.7: 3.107% 124266 | 93.521% 3740839 0.7 < ulp < 0.8: 2.432% 97284 | 95.953% 3838123 0.8 < ulp < 0.9: 1.740% 69612 | 97.693% 3907735 0.9 < ulp < 1.0: 0.941% 37646 | 98.635% 3945381 1.0 < ulp < 1.5: 1.108% 44312 | 99.742% 3989693 1.5 < ulp < 2.0: 0.195% 7791 | 99.937% 3997484 2.0 < ulp < 3.0: 0.062% 2491 | 99.999% 3999975 3.0 < ulp < 0.0: 0.001% 25 | 100.000% 4000000 Max ulp: 3.259556 at 1.9667229652404785e+00 while the latter has % ./tlibm j0 -f -x 0x1p-9 -X 2 -PD -N 4 Interval tested for j0f: [0.00195312,2] ulp <= 0.5: 86.76% 3470362 | 86.759% 3470362 0.5 < ulp < 0.6: 5.531% 221257 | 92.290% 3691619 0.6 < ulp < 0.7: 2.761% 110437 | 95.051% 3802056 0.7 < ulp < 0.8: 1.705% 68195 | 96.756% 3870251 0.8 < ulp < 0.9: 1.228% 49134 | 97.985% 3919385 0.9 < ulp < 1.0: 0.841% 33628 | 98.825% 3953013 1.0 < ulp < 1.5: 1.087% 43475 | 99.912% 3996488 1.5 < ulp < 2.0: 0.087% 3473 | 99.999% 3999961 2.0 < ulp < 3.0: 0.001% 39 | 100.000% 4000000 Max ulp: 2.157274 at 1.9673234224319458e+00 The latter is more accurate, but its underlying algorithm uses summation-and-carry of the ascending series. This algorithm is sensitive to compiler options, so I haven't pushed it FreeBSD (, yet). -- Steve