diff options
Diffstat (limited to 'libc/docs/math')
| -rw-r--r-- | libc/docs/math/index.rst | 459 | ||||
| -rw-r--r-- | libc/docs/math/log.rst | 557 | ||||
| -rw-r--r-- | libc/docs/math/stdfix.rst | 149 |
3 files changed, 0 insertions, 1165 deletions
diff --git a/libc/docs/math/index.rst b/libc/docs/math/index.rst deleted file mode 100644 index 4934e93ccb16..000000000000 --- a/libc/docs/math/index.rst +++ /dev/null @@ -1,459 +0,0 @@ -.. _math: - -============== -Math Functions -============== - -.. include:: ../check.rst - -.. raw:: html - - <style> .green {color:green} </style> - -.. role:: green - -.. toctree:: - :hidden: - - log.rst - stdfix.rst - - -.. contents:: Table of Contents - :depth: 4 - :local: - -Source Locations -================ - -- The main source is located at: `libc/src/math <https://github.com/llvm/llvm-project/tree/main/libc/src/math>`_. -- The tests are located at: `libc/test/src/math <https://github.com/llvm/llvm-project/tree/main/libc/test/src/math>`_. -- The floating point utilities are located at: `libc/src/__support/FPUtil <https://github.com/llvm/llvm-project/tree/main/libc/src/__support/FPUtil>`_. - -Implementation Requirements / Goals -=================================== - -* The highest priority is to be as accurate as possible, according to the C and - IEEE 754 standards. By default, we will aim to be correctly rounded for `all rounding modes <https://en.cppreference.com/w/c/numeric/fenv/FE_round>`_. - The current rounding mode of the floating point environment is used to perform - computations and produce the final results. - - - To test for correctness, we compare the outputs with other correctly rounded - multiple-precision math libraries such as the `GNU MPFR library <https://www.mpfr.org/>`_ - or the `CORE-MATH library <https://core-math.gitlabpages.inria.fr/>`_. - -* Our next requirement is that the outputs are consistent across all platforms. - Notice that the consistency requirement will be satisfied automatically if the - implementation is correctly rounded. - -* Our last requirement for the implementations is to have good and predicable - performance: - - - The average performance should be comparable to other ``libc`` - implementations. - - The worst case performance should be within 10X-20X of the average. - - Platform-specific implementations or instructions could be added whenever it - makes sense and provides significant performance boost. - -* For other use cases that have strict requirements on the code size, memory - footprint, or latency, such as embedded systems, we will aim to be as accurate - as possible within the memory or latency budgets, and consistent across all - platforms. - - -Add a new math function to LLVM libc -==================================== - -* To add a new math function, follow the steps at: `libc/src/math/docs/add_math_function.md <https://github.com/llvm/llvm-project/tree/main/libc/src/math/docs/add_math_function.md>`_. - -Implementation Status -===================== - -* To check math functions enabled for Linux: - - - `linux-x86_64 <https://github.com/llvm/llvm-project/tree/main/libc/config/linux/x86_64/entrypoints.txt>`_ - - - `linux-aarch64 <https://github.com/llvm/llvm-project/tree/main/libc/config/linux/aarch64/entrypoints.txt>`_ - - - `linux-aarch32 <https://github.com/llvm/llvm-project/tree/main/libc/config/linux/arm/entrypoints.txt>`_ - - - `linux-riscv and linux-riscv32 <https://github.com/llvm/llvm-project/tree/main/libc/config/linux/riscv/entrypoints.txt>`_ - -* To check math functions enabled for Windows: - - - `windows-x86_64 <https://github.com/llvm/llvm-project/tree/main/libc/config/windows/entrypoints.txt>`_ - - - windows-aarch64 - to be added - -* To check math functions enabled for macOS: - - - `darwin-x86_64 <https://github.com/llvm/llvm-project/tree/main/libc/config/darwin/x86_64/entrypoints.txt>`_ - - - `darwin-aarch64 <https://github.com/llvm/llvm-project/tree/main/libc/config/darwin/arm/entrypoints.txt>`_ - -* To check math functions enabled for GPU: - - - `gpu-entrypoints <https://github.com/llvm/llvm-project/tree/main/libc/config/gpu/entrypoints.txt>`_ - -* To check math functions enabled for embedded system: - - - `baremetal-aarch32 <https://github.com/llvm/llvm-project/tree/main/libc/config/baremetal/arm/entrypoints.txt>`_ - - - baremetal-riscv32 - to be added - - -Basic Operations -================ - -+------------------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+----------------------------+ -| <Func> | <Func_f> (float) | <Func> (double) | <Func_l> (long double) | <Func_f16> (float16) | <Func_f128> (float128) | C23 Definition Section | C23 Error Handling Section | -+==================+==================+=================+========================+======================+========================+========================+============================+ -| ceil | |check| | |check| | |check| | |check| | |check| | 7.12.9.1 | F.10.6.1 | -+------------------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+----------------------------+ -| canonicalize | |check| | |check| | |check| | |check| | |check| | 7.12.11.7 | F.10.8.7 | -+------------------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+----------------------------+ -| copysign | |check| | |check| | |check| | |check| | |check| | 7.12.11.1 | F.10.8.1 | -+------------------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+----------------------------+ -| dadd | N/A | N/A | |check| | N/A | |check|\* | 7.12.14.1 | F.10.11 | -+------------------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+----------------------------+ -| ddiv | N/A | N/A | |check| | N/A | |check|\* | 7.12.14.4 | F.10.11 | -+------------------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+----------------------------+ -| dfma | N/A | N/A | |check| | N/A | |check|\* | 7.12.14.5 | F.10.11 | -+------------------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+----------------------------+ -| dmul | N/A | N/A | |check| | N/A | |check|\* | 7.12.14.3 | F.10.11 | -+------------------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+----------------------------+ -| dsub | N/A | N/A | |check| | N/A | |check|\* | 7.12.14.2 | F.10.11 | -+------------------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+----------------------------+ -| f16add | |check|\* | |check|\* | |check|\* | N/A | |check| | 7.12.14.1 | F.10.11 | -+------------------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+----------------------------+ -| f16div | |check|\* | |check|\* | |check|\* | N/A | |check| | 7.12.14.4 | F.10.11 | -+------------------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+----------------------------+ -| f16fma | |check|\* | |check|\* | |check|\* | N/A | |check| | 7.12.14.5 | F.10.11 | -+------------------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+----------------------------+ -| f16mul | |check|\* | |check|\* | |check|\* | N/A | |check| | 7.12.14.5 | F.10.11 | -+------------------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+----------------------------+ -| f16sub | |check|\* | |check|\* | |check|\* | N/A | |check| | 7.12.14.2 | F.10.11 | -+------------------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+----------------------------+ -| fabs | |check| | |check| | |check| | |check| | |check| | 7.12.7.3 | F.10.4.3 | -+------------------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+----------------------------+ -| fadd | N/A | |check| | |check| | N/A | |check| | 7.12.14.1 | F.10.11 | -+------------------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+----------------------------+ -| fdim | |check| | |check| | |check| | |check| | |check| | 7.12.12.1 | F.10.9.1 | -+------------------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+----------------------------+ -| fdiv | N/A | |check| | |check| | N/A | |check|\* | 7.12.14.4 | F.10.11 | -+------------------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+----------------------------+ -| ffma | N/A | |check| | |check| | N/A | |check|\* | 7.12.14.5 | F.10.11 | -+------------------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+----------------------------+ -| floor | |check| | |check| | |check| | |check| | |check| | 7.12.9.2 | F.10.6.2 | -+------------------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+----------------------------+ -| fmax | |check| | |check| | |check| | |check| | |check| | 7.12.12.2 | F.10.9.2 | -+------------------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+----------------------------+ -| fmaximum | |check| | |check| | |check| | |check| | |check| | 7.12.12.4 | F.10.9.4 | -+------------------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+----------------------------+ -| fmaximum_mag | |check| | |check| | |check| | |check| | |check| | 7.12.12.6 | F.10.9.4 | -+------------------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+----------------------------+ -| fmaximum_mag_num | |check| | |check| | |check| | |check| | |check| | 7.12.12.10 | F.10.9.5 | -+------------------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+----------------------------+ -| fmaximum_num | |check| | |check| | |check| | |check| | |check| | 7.12.12.8 | F.10.9.5 | -+------------------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+----------------------------+ -| fmin | |check| | |check| | |check| | |check| | |check| | 7.12.12.3 | F.10.9.3 | -+------------------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+----------------------------+ -| fminimum | |check| | |check| | |check| | |check| | |check| | 7.12.12.5 | F.10.9.4 | -+------------------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+----------------------------+ -| fminimum_mag | |check| | |check| | |check| | |check| | |check| | 7.12.12.7 | F.10.9.4 | -+------------------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+----------------------------+ -| fminimum_mag_num | |check| | |check| | |check| | |check| | |check| | 7.12.12.11 | F.10.9.5 | -+------------------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+----------------------------+ -| fminimum_num | |check| | |check| | |check| | |check| | |check| | 7.12.12.9 | F.10.9.5 | -+------------------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+----------------------------+ -| fmod | |check| | |check| | |check| | |check| | |check| | 7.12.10.1 | F.10.7.1 | -+------------------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+----------------------------+ -| fmul | N/A | |check| | |check| | N/A | |check|\* | 7.12.14.3 | F.10.11 | -+------------------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+----------------------------+ -| frexp | |check| | |check| | |check| | |check| | |check| | 7.12.6.7 | F.10.3.7 | -+------------------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+----------------------------+ -| fromfp | |check| | |check| | |check| | |check| | |check| | 7.12.9.10 | F.10.6.10 | -+------------------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+----------------------------+ -| fromfpx | |check| | |check| | |check| | |check| | |check| | 7.12.9.11 | F.10.6.11 | -+------------------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+----------------------------+ -| fsub | N/A | |check| | |check| | N/A | |check|\* | 7.12.14.2 | F.10.11 | -+------------------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+----------------------------+ -| getpayload | |check| | |check| | |check| | |check| | |check| | F.10.13.1 | N/A | -+------------------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+----------------------------+ -| ilogb | |check| | |check| | |check| | |check| | |check| | 7.12.6.8 | F.10.3.8 | -+------------------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+----------------------------+ -| iscanonical | |check| | |check| | |check| | |check| | |check| | 7.12.3.2 | N/A | -+------------------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+----------------------------+ -| issignaling | |check| | |check| | |check| | |check| | |check| | 7.12.3.8 | N/A | -+------------------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+----------------------------+ -| ldexp | |check| | |check| | |check| | |check| | |check| | 7.12.6.9 | F.10.3.9 | -+------------------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+----------------------------+ -| llogb | |check| | |check| | |check| | |check| | |check| | 7.12.6.10 | F.10.3.10 | -+------------------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+----------------------------+ -| llrint | |check| | |check| | |check| | |check| | |check| | 7.12.9.5 | F.10.6.5 | -+------------------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+----------------------------+ -| llround | |check| | |check| | |check| | |check| | |check| | 7.12.9.7 | F.10.6.7 | -+------------------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+----------------------------+ -| logb | |check| | |check| | |check| | |check| | |check| | 7.12.6.17 | F.10.3.17 | -+------------------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+----------------------------+ -| lrint | |check| | |check| | |check| | |check| | |check| | 7.12.9.5 | F.10.6.5 | -+------------------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+----------------------------+ -| lround | |check| | |check| | |check| | |check| | |check| | 7.12.9.7 | F.10.6.7 | -+------------------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+----------------------------+ -| modf | |check| | |check| | |check| | |check| | |check| | 7.12.6.18 | F.10.3.18 | -+------------------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+----------------------------+ -| nan | |check| | |check| | |check| | |check| | |check| | 7.12.11.2 | F.10.8.2 | -+------------------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+----------------------------+ -| nearbyint | |check| | |check| | |check| | |check| | |check| | 7.12.9.3 | F.10.6.3 | -+------------------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+----------------------------+ -| nextafter | |check| | |check| | |check| | |check| | |check| | 7.12.11.3 | F.10.8.3 | -+------------------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+----------------------------+ -| nextdown | |check| | |check| | |check| | |check| | |check| | 7.12.11.6 | F.10.8.6 | -+------------------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+----------------------------+ -| nexttoward | |check| | |check| | |check| | |check| | N/A | 7.12.11.4 | F.10.8.4 | -+------------------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+----------------------------+ -| nextup | |check| | |check| | |check| | |check| | |check| | 7.12.11.5 | F.10.8.5 | -+------------------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+----------------------------+ -| remainder | |check| | |check| | |check| | |check| | |check| | 7.12.10.2 | F.10.7.2 | -+------------------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+----------------------------+ -| remquo | |check| | |check| | |check| | |check| | |check| | 7.12.10.3 | F.10.7.3 | -+------------------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+----------------------------+ -| rint | |check| | |check| | |check| | |check| | |check| | 7.12.9.4 | F.10.6.4 | -+------------------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+----------------------------+ -| round | |check| | |check| | |check| | |check| | |check| | 7.12.9.6 | F.10.6.6 | -+------------------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+----------------------------+ -| roundeven | |check| | |check| | |check| | |check| | |check| | 7.12.9.8 | F.10.6.8 | -+------------------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+----------------------------+ -| scalbln | |check| | |check| | |check| | |check| | |check| | 7.12.6.19 | F.10.3.19 | -+------------------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+----------------------------+ -| scalbn | |check| | |check| | |check| | |check| | |check| | 7.12.6.19 | F.10.3.19 | -+------------------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+----------------------------+ -| setpayload | |check| | |check| | |check| | |check| | |check| | F.10.13.2 | N/A | -+------------------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+----------------------------+ -| setpayloadsig | |check| | |check| | |check| | |check| | |check| | F.10.13.3 | N/A | -+------------------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+----------------------------+ -| totalorder | |check| | |check| | |check| | |check| | |check| | F.10.12.1 | N/A | -+------------------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+----------------------------+ -| totalordermag | |check| | |check| | |check| | |check| | |check| | F.10.12.2 | N/A | -+------------------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+----------------------------+ -| trunc | |check| | |check| | |check| | |check| | |check| | 7.12.9.9 | F.10.6.9 | -+------------------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+----------------------------+ -| ufromfp | |check| | |check| | |check| | |check| | |check| | 7.12.9.10 | F.10.6.10 | -+------------------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+----------------------------+ -| ufromfpx | |check| | |check| | |check| | |check| | |check| | 7.12.9.11 | F.10.6.11 | -+------------------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+----------------------------+ - - -Higher Math Functions -===================== - -+-----------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+----------------------------+ -| <Func> | <Func_f> (float) | <Func> (double) | <Func_l> (long double) | <Func_f16> (float16) | <Func_f128> (float128) | C23 Definition Section | C23 Error Handling Section | -+===========+==================+=================+========================+======================+========================+========================+============================+ -| acos | |check| | | | | | 7.12.4.1 | F.10.1.1 | -+-----------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+----------------------------+ -| acosh | |check| | | | | | 7.12.5.1 | F.10.2.1 | -+-----------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+----------------------------+ -| acospi | | | | | | 7.12.4.8 | F.10.1.8 | -+-----------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+----------------------------+ -| asin | |check| | | | | | 7.12.4.2 | F.10.1.2 | -+-----------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+----------------------------+ -| asinh | |check| | | | | | 7.12.5.2 | F.10.2.2 | -+-----------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+----------------------------+ -| asinpi | | | | | | 7.12.4.9 | F.10.1.9 | -+-----------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+----------------------------+ -| atan | |check| | | | | | 7.12.4.3 | F.10.1.3 | -+-----------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+----------------------------+ -| atan2 | |check| | 1 ULP | | | | 7.12.4.4 | F.10.1.4 | -+-----------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+----------------------------+ -| atan2pi | | | | | | 7.12.4.11 | F.10.1.11 | -+-----------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+----------------------------+ -| atanh | |check| | | | | | 7.12.5.3 | F.10.2.3 | -+-----------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+----------------------------+ -| atanpi | | | | | | 7.12.4.10 | F.10.1.10 | -+-----------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+----------------------------+ -| cbrt | |check| | |check| | | | | 7.12.7.1 | F.10.4.1 | -+-----------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+----------------------------+ -| compoundn | | | | | | 7.12.7.2 | F.10.4.2 | -+-----------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+----------------------------+ -| cos | |check| | |check| | | | | 7.12.4.5 | F.10.1.5 | -+-----------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+----------------------------+ -| cosh | |check| | | | |check| | | 7.12.5.4 | F.10.2.4 | -+-----------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+----------------------------+ -| cospi | |check| | | | |check| | | 7.12.4.12 | F.10.1.12 | -+-----------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+----------------------------+ -| dsqrt | N/A | N/A | |check| | N/A | |check|\* | 7.12.14.6 | F.10.11 | -+-----------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+----------------------------+ -| erf | |check| | | | | | 7.12.8.1 | F.10.5.1 | -+-----------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+----------------------------+ -| erfc | | | | | | 7.12.8.2 | F.10.5.2 | -+-----------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+----------------------------+ -| exp | |check| | |check| | | |check| | | 7.12.6.1 | F.10.3.1 | -+-----------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+----------------------------+ -| exp10 | |check| | |check| | | |check| | | 7.12.6.2 | F.10.3.2 | -+-----------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+----------------------------+ -| exp10m1 | |check| | | | |check| | | 7.12.6.3 | F.10.3.3 | -+-----------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+----------------------------+ -| exp2 | |check| | |check| | | |check| | | 7.12.6.4 | F.10.3.4 | -+-----------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+----------------------------+ -| exp2m1 | |check| | | | |check| | | 7.12.6.5 | F.10.3.5 | -+-----------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+----------------------------+ -| expm1 | |check| | |check| | | |check| | | 7.12.6.6 | F.10.3.6 | -+-----------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+----------------------------+ -| fma | |check| | |check| | | | | 7.12.13.1 | F.10.10.1 | -+-----------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+----------------------------+ -| f16sqrt | |check|\* | |check|\* | |check|\* | N/A | |check| | 7.12.14.6 | F.10.11 | -+-----------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+----------------------------+ -| fsqrt | N/A | |check| | |check| | N/A | |check|\* | 7.12.14.6 | F.10.11 | -+-----------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+----------------------------+ -| hypot | |check| | |check| | | | | 7.12.7.4 | F.10.4.4 | -+-----------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+----------------------------+ -| lgamma | | | | | | 7.12.8.3 | F.10.5.3 | -+-----------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+----------------------------+ -| log | |check| | |check| | | |check| | | 7.12.6.11 | F.10.3.11 | -+-----------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+----------------------------+ -| log10 | |check| | |check| | | |check| | | 7.12.6.12 | F.10.3.12 | -+-----------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+----------------------------+ -| log10p1 | | | | | | 7.12.6.13 | F.10.3.13 | -+-----------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+----------------------------+ -| log1p | |check| | |check| | | | | 7.12.6.14 | F.10.3.14 | -+-----------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+----------------------------+ -| log2 | |check| | |check| | | |check| | | 7.12.6.15 | F.10.3.15 | -+-----------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+----------------------------+ -| log2p1 | | | | | | 7.12.6.16 | F.10.3.16 | -+-----------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+----------------------------+ -| logp1 | | | | | | 7.12.6.14 | F.10.3.14 | -+-----------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+----------------------------+ -| pow | |check| | 1 ULP | | | | 7.12.7.5 | F.10.4.5 | -+-----------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+----------------------------+ -| powi\* | | | | | | | | -+-----------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+----------------------------+ -| pown | | | | | | 7.12.7.6 | F.10.4.6 | -+-----------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+----------------------------+ -| powr | | | | | | 7.12.7.7 | F.10.4.7 | -+-----------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+----------------------------+ -| rootn | | | | | | 7.12.7.8 | F.10.4.8 | -+-----------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+----------------------------+ -| rsqrt | | | | | | 7.12.7.9 | F.10.4.9 | -+-----------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+----------------------------+ -| sin | |check| | |check| | | |check| | | 7.12.4.6 | F.10.1.6 | -+-----------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+----------------------------+ -| sincos | |check| | |check| | | | | | | -+-----------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+----------------------------+ -| sinh | |check| | | | |check| | | 7.12.5.5 | F.10.2.5 | -+-----------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+----------------------------+ -| sinpi | |check| | | | |check| | | 7.12.4.13 | F.10.1.13 | -+-----------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+----------------------------+ -| sqrt | |check| | |check| | |check| | |check| | |check| | 7.12.7.10 | F.10.4.10 | -+-----------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+----------------------------+ -| tan | |check| | |check| | | | | 7.12.4.7 | F.10.1.7 | -+-----------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+----------------------------+ -| tanh | |check| | | | |check| | | 7.12.5.6 | F.10.2.6 | -+-----------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+----------------------------+ -| tanpi | | | | |check| | | 7.12.4.14 | F.10.1.14 | -+-----------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+----------------------------+ -| tgamma | | | | | | 7.12.8.4 | F.10.5.4 | -+-----------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+----------------------------+ - -Legends: - -* |check| : correctly rounded for all 4 rounding modes. -* CR: correctly rounded for the default rounding mode (round-to-the-nearest, - tie-to-even). -* x ULPs: largest errors recorded. -* N/A: Not defined in the standard or will not be added. -* \*: LLVM libc extension. - -.. - TODO(lntue): Add a new page to discuss about the algorithms used in the - implementations and include the link here. - - -Performance -=========== - -* Simple performance testings are located at: `libc/test/src/math/performance_testing <https://github.com/llvm/llvm-project/tree/main/libc/test/src/math/performance_testing>`_. - -* We also use the *perf* tool from the `CORE-MATH <https://core-math.gitlabpages.inria.fr/>`_ - project: `link <https://gitlab.inria.fr/core-math/core-math/-/tree/master>`_. - The performance results from the CORE-MATH's perf tool are reported in the - table below, using the system library as reference (such as the `GNU C library <https://www.gnu.org/software/libc/>`_ - on Linux). Fmod performance results obtained with "performance_testing". - -+--------------+-------------------------------+-------------------------------+-------------------------------------+----------------------------------------------------------------------+ -| <Func> | Reciprocal throughput (clk) | Latency (clk) | Testing ranges | Testing configuration | -| +-----------+-------------------+-----------+-------------------+ +-------------+-------------------------+--------------+---------------+ -| | LLVM libc | Reference (glibc) | LLVM libc | Reference (glibc) | | CPU | OS | Compiler | Special flags | -+==============+===========+===================+===========+===================+=====================================+=============+=========================+==============+===============+ -| acosf | 24 | 29 | 62 | 77 | :math:`[-1, 1]` | Ryzen 1700 | Ubuntu 22.04 LTS x86_64 | Clang 14.0.0 | FMA | -+--------------+-----------+-------------------+-----------+-------------------+-------------------------------------+-------------+-------------------------+--------------+---------------+ -| acoshf | 18 | 26 | 73 | 74 | :math:`[1, 21]` | Ryzen 1700 | Ubuntu 22.04 LTS x86_64 | Clang 14.0.0 | FMA | -+--------------+-----------+-------------------+-----------+-------------------+-------------------------------------+-------------+-------------------------+--------------+---------------+ -| asinf | 23 | 27 | 62 | 62 | :math:`[-1, 1]` | Ryzen 1700 | Ubuntu 22.04 LTS x86_64 | Clang 14.0.0 | FMA | -+--------------+-----------+-------------------+-----------+-------------------+-------------------------------------+-------------+-------------------------+--------------+---------------+ -| asinhf | 21 | 39 | 77 | 91 | :math:`[-10, 10]` | Ryzen 1700 | Ubuntu 22.04 LTS x86_64 | Clang 14.0.0 | FMA | -+--------------+-----------+-------------------+-----------+-------------------+-------------------------------------+-------------+-------------------------+--------------+---------------+ -| atanf | 27 | 29 | 79 | 68 | :math:`[-10, 10]` | Ryzen 1700 | Ubuntu 22.04 LTS x86_64 | Clang 14.0.0 | FMA | -+--------------+-----------+-------------------+-----------+-------------------+-------------------------------------+-------------+-------------------------+--------------+---------------+ -| atanhf | 18 | 66 | 68 | 133 | :math:`[-1, 1]` | Ryzen 1700 | Ubuntu 22.04 LTS x86_64 | Clang 14.0.0 | FMA | -+--------------+-----------+-------------------+-----------+-------------------+-------------------------------------+-------------+-------------------------+--------------+---------------+ -| cosf | 13 | 32 | 53 | 59 | :math:`[0, 2\pi]` | Ryzen 1700 | Ubuntu 20.04 LTS x86_64 | Clang 12.0.0 | FMA | -+--------------+-----------+-------------------+-----------+-------------------+-------------------------------------+-------------+-------------------------+--------------+---------------+ -| coshf | 14 | 20 | 50 | 48 | :math:`[-10, 10]` | Ryzen 1700 | Ubuntu 22.04 LTS x86_64 | Clang 14.0.0 | FMA | -+--------------+-----------+-------------------+-----------+-------------------+-------------------------------------+-------------+-------------------------+--------------+---------------+ -| expf | 9 | 7 | 44 | 38 | :math:`[-10, 10]` | Ryzen 1700 | Ubuntu 20.04 LTS x86_64 | Clang 12.0.0 | FMA | -+--------------+-----------+-------------------+-----------+-------------------+-------------------------------------+-------------+-------------------------+--------------+---------------+ -| exp10f | 10 | 8 | 40 | 38 | :math:`[-10, 10]` | Ryzen 1700 | Ubuntu 22.04 LTS x86_64 | Clang 14.0.0 | FMA | -+--------------+-----------+-------------------+-----------+-------------------+-------------------------------------+-------------+-------------------------+--------------+---------------+ -| exp2f | 9 | 6 | 35 | 31 | :math:`[-10, 10]` | Ryzen 1700 | Ubuntu 22.04 LTS x86_64 | Clang 14.0.0 | FMA | -+--------------+-----------+-------------------+-----------+-------------------+-------------------------------------+-------------+-------------------------+--------------+---------------+ -| expm1f | 9 | 44 | 42 | 121 | :math:`[-10, 10]` | Ryzen 1700 | Ubuntu 20.04 LTS x86_64 | Clang 12.0.0 | FMA | -+--------------+-----------+-------------------+-----------+-------------------+-------------------------------------+-------------+-------------------------+--------------+---------------+ -| fmodf | 73 | 263 | - | - | [MIN_NORMAL, MAX_NORMAL] | i5 mobile | Ubuntu 20.04 LTS x86_64 | Clang 12.0.0 | | -| +-----------+-------------------+-----------+-------------------+-------------------------------------+-------------+-------------------------+--------------+---------------+ -| | 9 | 11 | - | - | [0, MAX_SUBNORMAL] | i5 mobile | Ubuntu 20.04 LTS x86_64 | Clang 12.0.0 | | -+--------------+-----------+-------------------+-----------+-------------------+-------------------------------------+-------------+-------------------------+--------------+---------------+ -| fmod | 595 | 3297 | - | - | [MIN_NORMAL, MAX_NORMAL] | i5 mobile | Ubuntu 20.04 LTS x86_64 | Clang 12.0.0 | | -| +-----------+-------------------+-----------+-------------------+-------------------------------------+-------------+-------------------------+--------------+---------------+ -| | 14 | 13 | - | - | [0, MAX_SUBNORMAL] | i5 mobile | Ubuntu 20.04 LTS x86_64 | Clang 12.0.0 | | -+--------------+-----------+-------------------+-----------+-------------------+-------------------------------------+-------------+-------------------------+--------------+---------------+ -| hypotf | 25 | 15 | 64 | 49 | :math:`[-10, 10] \times [-10, 10]` | Ryzen 1700 | Ubuntu 20.04 LTS x86_64 | Clang 12.0.0 | | -+--------------+-----------+-------------------+-----------+-------------------+-------------------------------------+-------------+-------------------------+--------------+---------------+ -| logf | 12 | 10 | 56 | 46 | :math:`[e^{-1}, e]` | Ryzen 1700 | Ubuntu 20.04 LTS x86_64 | Clang 12.0.0 | FMA | -+--------------+-----------+-------------------+-----------+-------------------+-------------------------------------+-------------+-------------------------+--------------+---------------+ -| log10f | 9 | 17 | 35 | 48 | :math:`[e^{-1}, e]` | Ryzen 5900X | Ubuntu 22.04 LTS x86_64 | Clang 15.0.6 | FMA | -+--------------+-----------+-------------------+-----------+-------------------+-------------------------------------+-------------+-------------------------+--------------+---------------+ -| log1pf | 16 | 33 | 61 | 97 | :math:`[e^{-0.5} - 1, e^{0.5} - 1]` | Ryzen 1700 | Ubuntu 20.04 LTS x86_64 | Clang 12.0.0 | FMA | -+--------------+-----------+-------------------+-----------+-------------------+-------------------------------------+-------------+-------------------------+--------------+---------------+ -| log2f | 13 | 10 | 57 | 46 | :math:`[e^{-1}, e]` | Ryzen 1700 | Ubuntu 20.04 LTS x86_64 | Clang 12.0.0 | FMA | -+--------------+-----------+-------------------+-----------+-------------------+-------------------------------------+-------------+-------------------------+--------------+---------------+ -| sinf | 12 | 25 | 51 | 57 | :math:`[-\pi, \pi]` | Ryzen 1700 | Ubuntu 20.04 LTS x86_64 | Clang 12.0.0 | FMA | -+--------------+-----------+-------------------+-----------+-------------------+-------------------------------------+-------------+-------------------------+--------------+---------------+ -| sincosf | 19 | 30 | 57 | 68 | :math:`[-\pi, \pi]` | Ryzen 1700 | Ubuntu 20.04 LTS x86_64 | Clang 12.0.0 | FMA | -+--------------+-----------+-------------------+-----------+-------------------+-------------------------------------+-------------+-------------------------+--------------+---------------+ -| sinhf | 13 | 63 | 48 | 137 | :math:`[-10, 10]` | Ryzen 1700 | Ubuntu 22.04 LTS x86_64 | Clang 14.0.0 | FMA | -+--------------+-----------+-------------------+-----------+-------------------+-------------------------------------+-------------+-------------------------+--------------+---------------+ -| tanf | 16 | 50 | 61 | 107 | :math:`[-\pi, \pi]` | Ryzen 1700 | Ubuntu 22.04 LTS x86_64 | Clang 14.0.0 | FMA | -+--------------+-----------+-------------------+-----------+-------------------+-------------------------------------+-------------+-------------------------+--------------+---------------+ -| tanhf | 13 | 55 | 57 | 123 | :math:`[-10, 10]` | Ryzen 1700 | Ubuntu 22.04 LTS x86_64 | Clang 14.0.0 | FMA | -+--------------+-----------+-------------------+-----------+-------------------+-------------------------------------+-------------+-------------------------+--------------+---------------+ - -Algorithms + Implementation Details -=================================== - -* :doc:`log` - -Fixed-point Arithmetics -======================= - -* :doc:`stdfix` - -References -========== - -* `CRLIBM <https://hal-ens-lyon.archives-ouvertes.fr/ensl-01529804/file/crlibm.pdf>`_. -* `RLIBM <https://people.cs.rutgers.edu/~sn349/rlibm/>`_. -* `Sollya <https://www.sollya.org/>`_. -* `The CORE-MATH Project <https://core-math.gitlabpages.inria.fr/>`_. -* `The GNU C Library (glibc) <https://www.gnu.org/software/libc/>`_. -* `The GNU MPFR Library <https://www.mpfr.org/>`_. diff --git a/libc/docs/math/log.rst b/libc/docs/math/log.rst deleted file mode 100644 index 82d2e2be6fb5..000000000000 --- a/libc/docs/math/log.rst +++ /dev/null @@ -1,557 +0,0 @@ -.. _log_algorithm: - -======================== -Log/Log10/Log2 Algorithm -======================== - -.. default-role:: math - -In this short note, we will discuss in detail about the computation of -:math:`\log(x)` function, with double precision inputs, in particular, the range -reduction steps and error analysis. The algorithm is broken down into 2 main -phases as follow: - -1. Fast phase: - - a. Range reduction - b. Polynomial approximation - c. Ziv's test - -2. Accurate phase (if Ziv's test failed): - - a. Further range reduction - b. Polynomial approximation - - -Fast phase -========== - -Range reduction ---------------- - -Let `x = 2^{e_x} (1 + m_x)` be a normalized double precision number, in which -`-1074 \leq e_x \leq 1022` and `0 \leq m_x < 1` such that -`2^{52} m_x \in \mathbb{Z}`. - -Then from the properties of logarithm: - -.. math:: - \log(x) &= \log\left( 2^{e_x} (1 + m_x) \right) \\ - &= \log\left( 2^{e_x} \right) + \log(1 + m_x) \\ - &= e_x \log(2) + \log(1 + m_x) - -the computation of `\log(x)` can be reduced to: - -1. compute the product of `e_x` and `\log(2)`, -2. compute `\log(1 + m_x)` for `0 \leq m_x < 1`, -3. add step 1 and 2. - -To compute `\log(1 + m_x)` in step 2, we can reduce the range further by finding -`r > 0` such that: - -.. math:: - | r(1 + m_x) - 1 | < C \quad \quad \text{(R1)} - -for small `0 < C < 1`. Then if we let `u = r(1 + m_x) - 1`, `|u| < C`: - -.. math:: - \log(1 + m_x) &= \log \left( \frac{r (1 + m_x)}{r} \right) \\ - &= \log(r (1 + m_x) ) - \log(r) \\ - &= \log(1 + u) - \log(r) - -and step 2 can be computed with: - -a. extract `r` and `-\log(r)` from look-up tables, -b. compute the reduced argument `u = r(1 + m_x) - 1`, -c. compute `\log(1 + u)` by polynomial approximation or further range reduction, -d. add step a and step c results. - - -How to derive `r` ------------------ - -For an efficient implementation, we would like to use the first `M` significant -bits of `m_x` to look up for `r`. In particular, we would like to find a value -of `r` that works for all `m_x` satisfying: - -.. math:: - k 2^{-M} \leq m_x < (k + 1) 2^{-M} \quad \text{for some} \quad - k = 0..2^{M} - 1. \quad\quad \text{(M1)} - -Let `r = 1 + s`, then `u` can be expressed in terms of `s` as: - -.. math:: - u &= r(1 + m_x) - 1 \\ - &= (1 + s)(1 + m_x) - 1 \\ - &= s m_x + s + m_x &\quad\quad \text{(U1)} \\ - &= s (1 + m_x) + m_x \\ - &= m_x (1 + s) + s. - -From the condition `\text{(R1)}`, `s` is bounded by: - -.. math:: - \frac{-C - m_x}{1 + m_x} < s < \frac{C - m_x}{1 + m_x} \quad\quad \text{(S1)}. - -Since our reduction constant `s` must work for all `m_x` in the interval -`I = \{ v: k 2^{-M} \leq v < (k + 1) 2^{-M} \}`, `s` is bounded by: - -.. math:: - \sup_{v \in I} \frac{-C - v}{1 + v} < s < \inf_{v \in I} \frac{C - v}{1 + v} - -For a fixed constant `|c| < 1`, let `f(v) = \frac{c - v}{1 + v}`, then its -derivative is: - -.. math:: - f'(v) = \frac{(-1)(1 + v) - (1)(c - v)}{(1 + v)^2} = \frac{-1 - c}{(1 + v)^2}. - -Since `|c| < 1`, `f'(v) < 0` for all `v \neq -1`, so: - -.. math:: - \sup_{v \in I} f(v) &= f \left( \inf\{ v: v \in I \} \right) - = f \left( k 2^{-M} \right) \\ - \inf_{v \in I} f(v) &= f \left( \sup\{ v: v \in I \} \right) - = f \left( (k + 1) 2^{-M} \right) - -Hence we have the following bound on `s`: - -.. math:: - \frac{-C - k 2^{-M}}{1 + k 2^{-M}} < s \leq - \frac{C - (k + 1) 2^{-M}}{1 + (k + 1) 2^{-M}}. \quad\quad \text{(S2)} - -In order for `s` to exist, we need that: - -.. math:: - \frac{C - (k + 1) 2^{-M}}{1 + (k + 1) 2^{-M}} > - \frac{-C - k 2^{-M}}{1 + k 2^{-M}} - -which is equivalent to: - -.. math:: - \quad\quad 2C - 2^{-M} + (2k + 1) 2^{-M} C > 0 - \iff C > \frac{2^{-M - 1}}{1 + (2k + 1) 2^{-M - 1}} \quad\quad \text{(C1)}. - -Consider the case `C = 2^{-N}`. Since `0 \leq k \leq 2^M - 1,` the right hand -side of `\text{(C1)}` is bounded by: - -.. math:: - 2^{-M - 1} > \frac{2^{-M - 1}}{1 + (2k + 1) 2^{-M - 1}} \geq - \frac{2^{-M - 1}}{1 + (2^{M + 1} - 1) 2^{-M - 1}} > 2^{-M - 2}. - -Hence, from `\text{(C1)}`, being an exact power of 2, `C = 2^{-N}` is bounded below -by: - -.. math:: - C = 2^{-N} \geq 2^{-M - 1}. - -To make the range reduction efficient, we will want to minimize `C` (maximize -`N`) while keeping the required precision of `s`(`r`) as low as possible. And -for that, we will consider the following two cases: `N = M + 1` and `N = M`. - -Case 1 - `N = M + 1` -~~~~~~~~~~~~~~~~~~~~ - -When `N = M + 1`, `\text{(S2)}` becomes: - -.. math:: - \frac{-2^{-M - 1} - k 2^{-M}}{1 + k 2^{-M}} < s < - \frac{2^{-M - 1} - (k + 1) 2^{-M}}{1 + (k + 1) 2^{-M}}. - \quad\quad \text{(S2')} - -This is an interval of length: - -.. math:: - l &= \frac{2^{-M - 1} - (k + 1) 2^{-M}}{1 + (k + 1) 2^{-M}} - - \frac{-2^{-M - 1} - k 2^{-M}}{1 + k 2^{-M}} \\ - &= \frac{(2k + 1)2^{-2M - 1}}{(1 + k 2^{-M})(1 + (k + 1)2^{-M})} - \quad\quad \text{(L1)} - -As a function of `k`, the length `l` has its derivative with respect to `k`: - -.. math:: - \frac{dl}{dk} = - \frac{2^{2M + 1} - 2k(k + 1) - 1} - {2^{4M}(1 + k 2^{-M})^2 (1 + (k + 1) 2^{-M})^2} - -which is always positive for `0 \leq k \leq 2^M - 1`. So for all -`0 < k < 2^{-M}` (`k = 0` will be treated differently in edge cases), and for -`M > 2`, `l` is bounded below by: - -.. math:: - l > 2^{-2M}. - -It implies that we can always find `s` with `\operatorname{ulp}(s) = 2^{-2M}`. -And from `\text{(U1)}`, `u = s(1 + m_x) + m_x`, its `ulp` is: - -.. math:: - \operatorname{ulp}(u) &= \operatorname{ulp}(s) \cdot \operatorname{ulp}(m_x) \\ - &= 2^{-2M} \operatorname{ulp}(m_x). - -Since: - -.. math:: - |u| < C = 2^{-N} = 2^{-M - 1}, - -Its required precision is: - -.. math:: - \operatorname{prec}(u) &= \log_2(2^{-M-1} / \operatorname{ulp}(u)) \\ - &= \log_2(2^{M - 1} / \operatorname{ulp}(m_x)) \\ - &= M - 1 - \log_2(\operatorname{ulp}(m_x)). - -This means that in this case, we cannot restrict `u` to be exactly representable -in double precision for double precision input `x` with `M > 2`. Nonetheless, -for a reasonable value of `M`, we can have `u` exactly representable in double -precision for single precision input `x` (`\operatorname{ulp}(m_x) = 2^{-23}`) -such that `|u| < 2^{-M - 1}` using a look-up table of size `2^M`. - -A particular formula for `s` can be derived from `\text{(S2')}` by the midpoint -formula: - -.. math:: - s &= 2^{-2M} \operatorname{round}\left( 2^{2M} \cdot \operatorname{midpoint} - \left(-\frac{-2^{-M - 1} - k2^{-M}}{1 + k 2^{-M}}, - \frac{2^{-M-1} - (k + 1)2^{-M}}{1 + (k + 1) 2^{-M}}\right) \right) \\ - &= 2^{-2M} \operatorname{round}\left( 2^{2M} \cdot \frac{1}{2} \left( - \frac{-2^{-M - 1} - k2^{-M}}{1 + k 2^{-M}} + - \frac{2^{-M - 1} + (k + 1)2^{-M}}{1 + (k + 1) 2^{-M}} - \right) \right) \\ - &= 2^{-2M} \operatorname{round}\left( \frac{ - - \left(k + \frac{1}{2} \right) \left(2^M - k - \frac{1}{2} \right) } - {(1 + k 2^{-N})(1 + (k + 1) 2^{-N})} \right) \\ - &= - 2^{-2M} \operatorname{round}\left( \frac{ - \left(k + \frac{1}{2} \right) \left(2^M - k - \frac{1}{2} \right) } - {(1 + k 2^{-N})(1 + (k + 1) 2^{-N})} \right) \quad\quad \text{(S3)} - -The corresponding range and formula for `r = 1 + s` are: - -.. math:: - \frac{1 - 2^{-M - 1}}{1 + k 2^{-M}} < r \leq - \frac{1 + 2^{-M - 1}}{1 + (k + 1) 2^{-M}} - -.. math:: - r &= 2^{-2M} \operatorname{round}\left( 2^{2M} \cdot - \operatorname{midpoint}\left( \frac{1 - 2^{-M - 1}}{1 + k 2^{-M}}, - \frac{1 + 2^{-M - 1}}{1 + (k + 1) 2^{-M}}\right) \right) \\ - &= 2^{-2M} \operatorname{round}\left( 2^{2M} \cdot \frac{1}{2} \left( - \frac{1 + 2^{-M-1}}{1 + (k + 1) 2^{-M}} + \frac{1 - 2^{-M-1}}{1 + k 2^{-M}} - \right) \right) \\ - &= 2^{-2M} \operatorname{round}\left( 2^{2M} \cdot \frac{ - 1 + \left(k + \frac{1}{2} \right) 2^{-M} - 2^{-2M-2} }{(1 + k 2^{-M}) - (1 + (k + 1) 2^{-M})} \right) - -Case 1 - `N = M` -~~~~~~~~~~~~~~~~ - -When `N = M`, `\text{(S2)}` becomes: - -.. math:: - \frac{-(k + 1)2^{-M}}{1 + k 2^{-M}} < s < \frac{-k 2^{-M}}{1 + (k + 1) 2^{-M}} - \quad\quad \text{(S2")} - -This is an interval of length: - -.. math:: - l &= \frac{- k 2^{-M}}{1 + (k + 1) 2^{-M}} - - \frac{- (k + 1) 2^{-M}}{1 + k 2^{-M}} \\ - &= \frac{2^{-M} (1 + (2k + 1) 2^{-M})}{(1 + k 2^{-M})(1 + (k + 1)2^{-M})} - \quad\quad \text{(L1')} - -As a function of `k`, its derivative with respect to `k`: - -.. math:: - \frac{dl}{dk} = - -\frac{2^{-2M}(k(k + 1)2^{-M + 1} + 2^{-M} + 2k + 1)} - {(1 + k 2^{-M})^2 (1 + (k + 1) 2^{-M})^2} - -which is always negative for `0 \leq k \leq 2^M - 1`. So for `M > 1`, `l` is -bounded below by: - -.. math:: - l > \frac{2^{-M - 1} (3 - 2^{-M})}{2 - 2^{-M}} > 2^{-M - 1}. - -It implies that we can always find `s` with `\operatorname{ulp}(s) = 2^{-M-1}`. -And from `\text{(U1)}`, `u = s(1 + m_x) + m_x`, its `ulp` is: - -.. math:: - \operatorname{ulp}(u) &= \operatorname{ulp}(s) \cdot \operatorname{ulp}(m_x) \\ - &= 2^{-M - 1} \operatorname{ulp}(m_x). - -Since: - -.. math:: - |u| < C = 2^{-N} = 2^{-M}, - -Its required precision is: - -.. math:: - \operatorname{prec}(u) &= \log_2(2^{-M} / \operatorname{ulp}(u)) \\ - &= \log_2(2 / \operatorname{ulp}(m_x)) \\ - &= 1 - \log_2(\operatorname{ulp}(m_x)). - -Hence, for double precision `x`, `\operatorname{ulp}(m_x) = 2^{-52}`, and the -precision needed for `u` is `\operatorname{prec}(u) = 53`, i.e., `u` can be -exactly representable in double precision. And in this case, `s` can be -derived from `\text{(S2")}` by the midpoint formula: - -.. math:: - s &= 2^{-M - 1} \operatorname{round}\left( 2^{M + 1} \cdot - \operatorname{midpoint} \left(-\frac{-(k + 1)2^{-M}}{1 + k 2^{-M}}, - \frac{-k2^{-M}}{1 + (k + 1) 2^{-M}}\right) \right) \\ - &= 2^{-M - 1} \operatorname{round}\left( 2^{M + 1} \cdot \frac{1}{2} \left( - \frac{-(k + 1)2^{-M}}{1 + k 2^{-M}} + \frac{-k2^{-M}}{1 + (k + 1) 2^{-M}} - \right) \right) \\ - &= -2^{-M - 1} \operatorname{round}\left( \frac{ - (2k + 1) + (2k^2 + 2k + 1) 2^{-M} } - {(1 + k 2^{-N})(1 + (k + 1) 2^{-N})} \right) \quad\quad \text{(S3')} - -The corresponding range and formula for `r = 1 + s` are: - -.. math:: - \frac{1 - 2^{-M}}{1 + k 2^{-M}} < r \leq \frac{1 + 2^{-M}}{1 + (k + 1) 2^{-M}} - -.. math:: - r &= 2^{-M-1} \operatorname{round}\left( 2^{M + 1} \cdot - \operatorname{midpoint}\left( \frac{1 - 2^{-M}}{1 + k 2^{-M}}, - \frac{1 + 2^{-M}}{1 + (k + 1) 2^{-M}}\right) \right) \\ - &= 2^{-M-1} \operatorname{round}\left( 2^{M + 1} \cdot \frac{1}{2} \left( - \frac{1 + 2^{-M}}{1 + (k + 1) 2^{-M}} + \frac{1 - 2^{-M}}{1 + k 2^{-M}} - \right) \right) \\ - &= 2^{-M - 1} \operatorname{round}\left( 2^{M + 1} \cdot \frac{ - 1 + \left(k + \frac{1}{2} \right) 2^{-M} - 2^{-2M-1} }{(1 + k 2^{-M}) - (1 + (k + 1) 2^{-M})} \right) - -Edge cases ----------- - -1. When `k = 0`, notice that: - -.. math:: - 0 = k 2^{-N} \leq m_x < (k + 1) 2^{-N} = 2^{-N} = C, - -so we can simply choose `r = 1` so that `\log(r) = 0` is exact, then `u = m_x`. -This will help reduce the accumulated errors when `m_x` is close to 0 while -maintaining the range reduction output's requirements. - -2. When `k = 2^{N} - 1`, `\text{(S2)}` becomes: - -.. math:: - -\frac{1}{2} - \frac{C - 2^{-M-1}}{2 - 2^{-M}} <> s \leq - -\frac{1}{2} + \frac{C}{2}. - -so when `C > 2^{-M - 1}` is a power of 2, we can always choose: - -.. math:: - s = -\frac{1}{2}, \quad \text{i.e.} \quad r = \frac{1}{2}. - -This reduction works well to avoid catastrophic cancellation happening when -`e_x = -1`. - -This also works when `C = 2^{-M - 1}` if we relax the condition on `u` to -`|u| \leq C = 2^{-M-1}`. - -Intermediate precision, and Ziv's test --------------------------------------- - -In the fast phase, we want extra precision while performant, so we use -double-double precision for most intermediate computation steps, and employ Ziv -test to see if the result is accurate or not. In our case, the Ziv's test can -be described as follow: - -1. Let `re = re.hi + re.lo` be the double-double output of the fast phase - computation. -2. Let `err` be an estimated upper bound of the errors of `re`. -3. If `\circ(re.hi + (re.lo - err)) == \circ(re.hi + (r.lo + err))` then the - result is correctly rounded to double precision for the current rounding mode - `\circ`. Otherwise, the accurate phase with extra precision is needed. - -For an easy and cheap estimation of the error bound `err`, since the range -reduction step described above is accurate, the errors of the result: - -.. math:: - \log(x) &= e_x \log(2) - \log(r) + \log(1 + u) \\ - &\approx e_x \log(2) - \log(r) + u P(u) - -come from 2 parts: - -1. the look-up part: `e_x \log(2) - \log(r)` -2. the polynomial approximation part: `u P(u)` - -The errors of the first part can be computed with a single `\operatorname{fma}` -operation: - -.. math:: - err_1 = \operatorname{fma}(e_x, err(\log(2)), err(\log(r))), - -and then combining with the errors of the second part for another -`\operatorname{fma}` operation: - -.. math:: - err = \operatorname{fma}(u, err(P), err_1) - - -Accurate phase -============== - -Extending range reduction -------------------------- - -Since the output `u = r(1 + m_x) - 1` of the fast phase's range reduction -is computed exactly, we can apply further range reduction steps by -using the following formula: - -.. math:: - u_{i + 1} = r_i(1 + u_i) - 1 = u_i \cdot r_i + (r_i - 1), - -where `|u_i| < 2^{-N_i}` and `u_0 = u` is representable in double precision. - -Let `s_i = r_i - 1`, then we can rewrite it as: - -.. math:: - u_{i + 1} &= (1 + s_i)(1 + u_i) - 1 \\ - &= s_i u_i + u_i + s_i \\ - &= u_i (1 + s_i) + s_i - &= s_i (1 + u_i) + u_i. - -Then the bound on `u_{i + 1}` is translated to `s_i` as: - -.. math:: - \frac{-2^{-N_{i + 1}} - u_i}{1 + u_i} < s_i < \frac{2^{-N_{i + 1}} - u_i}{1 + u_i}. - -Let say we divide the interval `[0, 2^-{N_i})` into `2^{M_i}` subintervals -evenly and use the index `k` such that: - -.. math:: - k 2^{-N_i - M_i} \leq u_i < (k + 1) 2^{-N_i - M_i}, - -to look-up for the reduction constant `s_{i, k}`. In other word, `k` is given -by the formula: - -.. math:: - k = \left\lfloor 2^{N_i + M_i} u_i \right\rfloor - -Notice that our reduction constant `s_{i, k}` must work for all `u_i` in the -interval `I = \{ v: k 2^{-N_i - M_i} \leq v < (k + 1) 2^{-N_i - M_i} \}`, -so it is bounded by: - -.. math:: - \sup_{v \in I} \frac{-2^{-N_{i + 1}} - v}{1 + v} < s_{i, k} < \inf_{v \in I} \frac{2^{-N_{i + 1}} - v}{1 + v} - -For a fixed constant `|C| < 1`, let `f(v) = \frac{C - v}{1 + v}`, then its derivative -is: - -.. math:: - f'(v) = \frac{(-1)(1 + v) - (1)(C - v)}{(1 + v)^2} = \frac{-1 - C}{(1 + v)^2}. - -Since `|C| < 1`, `f'(v) < 0` for all `v \neq -1`, so: - -.. math:: - \sup_{v \in I} f(v) &= f \left( \inf\{ v: v \in I \} \right) - = f \left( k 2^{-N_i - M_i} \right) \\ - \inf_{v \in I} f(v) &= f \left( \sup\{ v: v \in I \} \right) - = f \left( (k + 1) 2^{-N_i - M_i} \right) - -Hence we have the following bound on `s_{i, k}`: - -.. math:: - \frac{-2^{-N_{i + 1}} - k 2^{-N_i - M_i}}{1 + k 2^{-N_i - M_i}} < s_{i, k} - \leq \frac{2^{-N_{i + 1}} - (k + 1) 2^{-N_i - M_i}}{1 + (k + 1) 2^{-N_i - M_i}} - -This interval is of length: - -.. math:: - l &= \frac{2^{-N_{i + 1}} - (k + 1) 2^{-N_i - M_i}}{1 + (k + 1) 2^{-N_i - M_i}} - - \frac{-2^{-N_{i + 1}} - k 2^{-N_i - M_i}}{1 + k 2^{-N_i - M_i}} \\ - &= \frac{2^{-N_{i + 1} + 1} - 2^{-N_i - M_i} + (2k + 1) 2^{-N_{i + 1} - N_i - M_i}} - {(1 + k 2^{-N_i - M_i})(1 + (k + 1) 2^{-N_i -M_i})} - -So in order to be able to find `s_{i, k}`, we need that: - -.. math:: - 2^{-N_{i + 1} + 1} - 2^{-N_i - M_i} + (2k + 1) 2^{-N_{i + 1} - N_i - M_i} > 0 - -This give us the following bound on `N_{i + 1}`: - -.. math:: - N_{i + 1} \leq N_i + M_i + 1. - -To make the range reduction effective, we will want to maximize `N_{i + 1}`, so -let consider the two cases: `N_{i + 1} = N_i + M_i + 1` and -`N_{i + 1} = N_i + M_i`. - - - -The optimal choice to balance between maximizing `N_{i + 1}` and minimizing the -precision needed for `s_{i, k}` is: - -.. math:: - N_{i + 1} = N_i + M_i, - -and in this case, the optimal `\operatorname{ulp}(s_{i, k})` is: - -.. math:: - \operatorname{ulp}(s_{i, k}) = 2^{-N_i - M_i} - -and the corresponding `\operatorname{ulp}(u_{i + 1})` is: - -.. math:: - \operatorname{ulp}(u_{i + 1}) &= \operatorname{ulp}(u_i) \operatorname{ulp}(s_{i, k}) \\ - &= \operatorname{ulp}(u_i) \cdot 2^{-N_i - M_i} \\ - &= \operatorname{ulp}(u_0) \cdot 2^{-N_0 - M_0} \cdot 2^{-N_0 - M_0 - M_1} \cdots 2^{-N_0 - M_0 - M_1 - \cdots - M_i} \\ - &= 2^{-N_0 - 53} \cdot 2^{-N_0 - M_0} \cdot 2^{-N_0 - M_0 - M_1} \cdots 2^{-N_0 - M_0 - M_1 - \cdots - M_i} - -Since `|u_{i + 1}| < 2^{-N_{i + 1}} = 2^{-N_0 - M_1 - ... -M_i}`, the precision -of `u_{i + 1}` is: - -.. math:: - \operatorname{prec}(u_{i + 1}) &= (N_0 + 53) + (N_0 + M_0) + \cdots + - (N_0 + M_0 + \cdots + M_i) - (N_0 + M_0 + \cdots + M_i) \\ - &= (i + 1) N_0 + i M_0 + (i - 1) M_1 + \cdots + M_{i - 1} + 53 - -If we choose to have the same `M_0 = M_1 = \cdots = M_i = M`, this can be -simplified to: - -.. math:: - \operatorname{prec}(u_{i + 1}) = (i + 1) N_0 + \frac{i(i + 1)}{2} \cdot M + 53. - -We summarize the precision analysis for extending the range reduction in the -table below: - -+-------+-----+-----------+------------+--------------+-----------------+-------------------+ -| `N_0` | `M` | No. steps | Table size | Output bound | ulp(`s_{i, k}`) | prec(`u_{i + 1}`) | -+-------+-----+-----------+------------+--------------+-----------------+-------------------+ -| 7 | 4 | 1 | 32 | `2^{-11}` | `2^{-12}` | 60 | -| | +-----------+------------+--------------+-----------------+-------------------+ -| | | 2 | 64 | `2^{-15}` | `2^{-16}` | 71 | -| | +-----------+------------+--------------+-----------------+-------------------+ -| | | 3 | 96 | `2^{-19}` | `2^{-20}` | 86 | -| | +-----------+------------+--------------+-----------------+-------------------+ -| | | 4 | 128 | `2^{-23}` | `2^{-24}` | 105 | -| | +-----------+------------+--------------+-----------------+-------------------+ -| | | 5 | 160 | `2^{-27}` | `2^{-28}` | 128 | -| | +-----------+------------+--------------+-----------------+-------------------+ -| | | 6 | 192 | `2^{-31}` | `2^{-32}` | 155 | -| +-----+-----------+------------+--------------+-----------------+-------------------+ -| | 5 | 3 | 192 | `2^{-22}` | `2^{-23}` | 89 | -| | +-----------+------------+--------------+-----------------+-------------------+ -| | | 4 | 256 | `2^{-27}` | `2^{-28}` | 111 | -| | +-----------+------------+--------------+-----------------+-------------------+ -| | | 5 | 320 | `2^{-32}` | `2^{-33}` | 138 | -| | +-----------+------------+--------------+-----------------+-------------------+ -| | | 6 | 384 | `2^{-37}` | `2^{-38}` | 170 | -| +-----+-----------+------------+--------------+-----------------+-------------------+ -| | 6 | 3 | 384 | `2^{-25}` | `2^{-26}` | 92 | -| | +-----------+------------+--------------+-----------------+-------------------+ -| | | 4 | 512 | `2^{-31}` | `2^{-32}` | 117 | -| +-----+-----------+------------+--------------+-----------------+-------------------+ -| | 7 | 1 | 256 | `2^{-24}` | `2^{-15}` | 60 | -| | +-----------+------------+--------------+-----------------+-------------------+ -| | | 2 | 512 | `2^{-21}` | `2^{-22}` | 74 | -+-------+-----+-----------+------------+--------------+-----------------+-------------------+ - -where: - -- Number of steps = `i + 1` -- Table size = `(i + 1) 2^{M + 1}` -- Output bound = `2^{-N_{i + 1}} = 2^{-N_0 - (i + 1) M}` -- `\operatorname{ulp}(s_{i, k}) = 2^{-N_{i + 1} - 1}` -- `\operatorname{prec}(u_{i + 1}) = (i + 1) N_0 + \frac{i(i + 1)}{2} \cdot M + 53` diff --git a/libc/docs/math/stdfix.rst b/libc/docs/math/stdfix.rst deleted file mode 100644 index d8dcb0cfa4c5..000000000000 --- a/libc/docs/math/stdfix.rst +++ /dev/null @@ -1,149 +0,0 @@ -================ -StdFix Functions -================ - -.. include:: ../check.rst - -Standards and Goals -------------------- - -- stdfix.h is specified in the `ISO/IEC TR 18037:2008 <https://www.iso.org/standard/51126.html>`_, - C extensions to support embedded processors . - -- Its `specifications <https://standards.iso.org/ittf/PubliclyAvailableStandards/c051126_ISO_IEC_TR_18037_2008.zip>`_. - -- Our goal is to implement a complete set of math functions for fixed point - types, most of them are currently not included in the ISO/IEC TR - 18037:2008 standard. Our math functions for fixed point types are modeled - after the C99/C23 math functions for floating point types. - ---------------- -Source location ---------------- - -- The main source for fixed-point functions is located at: - ``libc/src/stdfix`` with subdirectories for internal implementations. - ---------------------- -Implementation Status ---------------------- - -Requirements -============ - -- In order to build LLVM libc to support fixed-point arithmetics, we need the - compiler to support the basic fixed-point types `_Fract` and `_Accum` in - C++. - -- For the users to be able to use the generated headers, their compiler needs - to support `_Fract` and `_Accum` types in C or C++. - -- This compiler support is checked at the beginning of - `libc/include/llvm-libc-macros/stdfix-macros.h <https://github.com/llvm/llvm-project/tree/main/libc/include/llvm-libc-macros/stdfix-macros.h>`_. - - - -Predefined Macros -================= - -- We use the macro `LIBC_COMPILER_HAS_FIXED_POINT` to specify whether the - compiler support the fixed-point types. - -- Other predefined precision macros specified in section 7.18a.3 are defined - in `libc/include/llvm-libc-macros/stdfix-macros.h <https://github.com/llvm/llvm-project/tree/main/libc/include/llvm-libc-macros/stdfix-macros.h>`_ - using the default configuration of `typical desktop processor` in section - A.3. - - -Fixed-point Arithmetics -======================= - -The following functions are included in the ISO/IEC TR 18037:2008 standard. - -+---------------+------------------------------------------------------------------------------------------+------------------------------------------------------------------------------------------+ -| Function Name | _Fract (r) | _Accum (k) | -| +------------------------------+----------------------------+------------------------------+------------------------------+----------------------------+------------------------------+ -| | short (hr) | _ (r) | long (lr) | short (hk) | _ (k) | long (lk) | -| +----------------+-------------+---------------+------------+----------------+-------------+----------------+-------------+---------------+------------+----------------+-------------+ -| | unsigned (uhr) | signed (hr) | unsigned (ur) | signed (r) | unsigned (ulr) | signed (lr) | unsigned (uhk) | signed (hk) | unsigned (uk) | signed (k) | unsigned (ulk) | signed (lk) | -+===============+================+=============+===============+============+================+=============+================+=============+===============+============+================+=============+ -| abs | | |check| | | |check| | | |check| | | |check| | | |check| | | |check| | -+---------------+----------------+-------------+---------------+------------+----------------+-------------+----------------+-------------+---------------+------------+----------------+-------------+ -| bits\* | | | | | | | | | | | | | -+---------------+----------------+-------------+---------------+------------+----------------+-------------+----------------+-------------+---------------+------------+----------------+-------------+ -| \*bits | | | | | | | | | | | | | -+---------------+----------------+-------------+---------------+------------+----------------+-------------+----------------+-------------+---------------+------------+----------------+-------------+ -| countls | | | | | | | | | | | | | -+---------------+----------------+-------------+---------------+------------+----------------+-------------+----------------+-------------+---------------+------------+----------------+-------------+ -| divi | | | | | | | | | | | | | -+---------------+----------------+-------------+---------------+------------+----------------+-------------+----------------+-------------+---------------+------------+----------------+-------------+ -| idivi | | | | | | | | | | | | | -+---------------+----------------+-------------+---------------+------------+----------------+-------------+----------------+-------------+---------------+------------+----------------+-------------+ -| muli | | | | | | | | | | | | | -+---------------+----------------+-------------+---------------+------------+----------------+-------------+----------------+-------------+---------------+------------+----------------+-------------+ -| rdivi | | | | | | | | | | | | | -+---------------+----------------+-------------+---------------+------------+----------------+-------------+----------------+-------------+---------------+------------+----------------+-------------+ -| round | |check| | |check| | |check| | |check| | |check| | |check| | |check| | |check| | |check| | |check| | |check| | |check| | -+---------------+----------------+-------------+---------------+------------+----------------+-------------+----------------+-------------+---------------+------------+----------------+-------------+ - -================== ========= -Type Generic Macro Available -================== ========= -absfx -countlsfx -roundfx -================== ========= - - -Higher math functions -===================== - -The following math functions are modeled after C99/C23 math functions for -floating point types, but are not part of the ISO/IEC TR 18037:2008 spec. - -+---------------+------------------------------------------------------------------------------------------+------------------------------------------------------------------------------------------+ -| Function Name | _Fract (r) | _Accum (k) | -| +------------------------------+----------------------------+------------------------------+------------------------------+----------------------------+------------------------------+ -| | short (hr) | _ (r) | long (lr) | short (hk) | _ (k) | long (lk) | -| +----------------+-------------+---------------+------------+----------------+-------------+----------------+-------------+---------------+------------+----------------+-------------+ -| | unsigned (uhr) | signed (hr) | unsigned (ur) | signed (r) | unsigned (ulr) | signed (lr) | unsigned (uhk) | signed (hk) | unsigned (uk) | signed (k) | unsigned (ulk) | signed (lk) | -+===============+================+=============+===============+============+================+=============+================+=============+===============+============+================+=============+ -| cos | | | | | | | | | | | | | -+---------------+----------------+-------------+---------------+------------+----------------+-------------+----------------+-------------+---------------+------------+----------------+-------------+ -| exp | | | | | | | | |check| | | |check| | | | -+---------------+----------------+-------------+---------------+------------+----------------+-------------+----------------+-------------+---------------+------------+----------------+-------------+ -| log | | | | | | | | | | | | | -+---------------+----------------+-------------+---------------+------------+----------------+-------------+----------------+-------------+---------------+------------+----------------+-------------+ -| sin | | | | | | | | | | | | | -+---------------+----------------+-------------+---------------+------------+----------------+-------------+----------------+-------------+---------------+------------+----------------+-------------+ -| sqrt | |check| | | |check| | | |check| | | |check| | | |check| | | | | -+---------------+----------------+-------------+---------------+------------+----------------+-------------+----------------+-------------+---------------+------------+----------------+-------------+ -| tan | | | | | | | | | | | | | -+---------------+----------------+-------------+---------------+------------+----------------+-------------+----------------+-------------+---------------+------------+----------------+-------------+ - - -Conversion Functions -==================== - -The following conversion functions are included in the ISO/IEC TR 18037:2008 -standard. - -+---------------+------------------------------------------------------------------------------------------+------------------------------------------------------------------------------------------+ -| Function Name | _Fract (r) | _Accum (k) | -| +------------------------------+----------------------------+------------------------------+------------------------------+----------------------------+------------------------------+ -| | short (hr) | _ (r) | long (lr) | short (hk) | _ (k) | long (lk) | -| +----------------+-------------+---------------+------------+----------------+-------------+----------------+-------------+---------------+------------+----------------+-------------+ -| | unsigned (uhr) | signed (hr) | unsigned (ur) | signed (r) | unsigned (ulr) | signed (lr) | unsigned (uhk) | signed (hk) | unsigned (uk) | signed (k) | unsigned (ulk) | signed (lk) | -+===============+================+=============+===============+============+================+=============+================+=============+===============+============+================+=============+ -| fprintf | | | | | | | | | | | | | -+---------------+----------------+-------------+---------------+------------+----------------+-------------+----------------+-------------+---------------+------------+----------------+-------------+ -| fscanf | | | | | | | | | | | | | -+---------------+----------------+-------------+---------------+------------+----------------+-------------+----------------+-------------+---------------+------------+----------------+-------------+ -| strtofx | | | | | | | | | | | | | -+---------------+----------------+-------------+---------------+------------+----------------+-------------+----------------+-------------+---------------+------------+----------------+-------------+ - - -Warnings -======== - -This is currently a work-in-progress, its headers, macros, and ABI are still unstable, and might be modified. |
