[libc-commits] [PATCH] D104615: [libc] Calculate ulp error after rounding MPFR result to the result type.
Tue Ly via Phabricator via libc-commits
libc-commits at lists.llvm.org
Mon Jun 21 12:46:33 PDT 2021
lntue added inline comments.
================
Comment at: libc/utils/MPFRWrapper/MPFRUtils.cpp:301
// we multiply by its inverse 2^{-e}.
mpfr_mul_2si(mpfrInput.value, mpfrInput.value, -epsExponent, MPFR_RNDN);
----------------
If we change to | input - float(mpfrValue) | / eps(input), we more or less calculating | input_bitfield - float(mpfrValue)_bitfield |, so in my opinion it's better to use
min (eps(input), eps(float(mpfrValue))), since that would avoid the case where float(mpfrValue) is 2^n and input is 2^n - (eps(x)/2) which is representable:
- if we use the eps(input), the calculated ulp will be 2,
- if we use min ( eps(input), eps(float(mpfrValue)) ), the calculated ulp will be 1.
A concrete example is that ulp( input = float(1 - 2^(-24)), float(mpfrValue) = float(1) )
Moreover, another advantage of using min (eps, eps) is that the ulp function will then be symmetric: ulp(a, b) = ulp(b, a).
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D104615/new/
https://reviews.llvm.org/D104615
More information about the libc-commits
mailing list