ãããããååæ¼ç®ã®èª¤å·®è©ä¾¡ã飽ãããªãããæ°å¦é¢æ°ã®è¨ç®ã¨ãããã£ã¦ã¿ã¦ããã¨ãã声ãèããã¦ãã*1ã®ã§ãä»æ¥ã¯ããããã¾ãã
å°å ¥
ããè¨ããã¦ãããããªåéãã«ã¤ãã¦ãä¸æ¦è§¦ãã¦ããã¾ãã
cbrt(x)
ã£ã¦pow(x, 1.0/3.0)
ã§ãããªãï¼
IEEE Std 754-2019 ã® 9.2.1 Special values ã«ã¯ãä¸è¨ã®è¨è¿°ãããã¾ãã
$\mathrm{pow}(x, y)$ signals the invalid operation exception for finite $x\lt 0$ and finite non-integer $y$.
å®éãpow(-1.0, 1.0/3.0)
ãè¨ç®ãã¦ã¿ãã¨ãC ã§ã¯ NaN ã«ãªããPython ã§ã¯ ValueError: math domain error
ãåºã¾ããã
ã¾ãã精度ã«ããã¦ãéããããã¾ãã
1.0/3.0
ã¨ããã®ã¯ã$\tfrac13$ ã¨ã¯ç°ãªãå¤ã§ãã
$$
\begin{aligned}
1\oslash3
&= 0.{\small 333333333333333}{\footnotesize 314829616256247}{\scriptsize 390992939472198}{\tiny 486328125} \\
&= \tfrac13\cdot(1-2^{-54}).
\end{aligned}
$$
$\tfrac13\cdot 2^{-54}$ ã®èª¤å·®ã®ããã§ãï¼cbrt
ã correctly-rounded ãªå¤ãè¿ãã¨ãã¦å®è£
ããã¦ããã¨ãã¦ãï¼ææã®å¤ã«ãªã£ã¦ãããªãã±ã¼ã¹ããã°ãã°çºçãã¾ãã
$$
\begin{aligned}
64^{\tfrac13\cdot(1-2^{-54})}
&= 3.{\small 999999999999999}{\footnotesize 692180816275335}{\scriptsize 216604455276753}{\tiny 748400773143551{\dots}}, \\
\roundp{64^{\tfrac13\cdot(1-2^{-54})}}
&= 3.{\small 999999999999999}{\footnotesize 555910790149937}{\scriptsize 383830547332763}{\tiny 671875} \\
&= 4-2^{-51}.
\end{aligned}
$$
ããããããã§ãå°ç¨ã®é¢æ°ã使ãå¿ è¦ãããããã§ããã
note: 1.0 / 3.0
ã渡ããã pow
é¢æ°å´ã«ããªã cbrt
ãè¨ç®ããããããªãæ°ã£å©ããã¦è£æ£ãã¨ãããï½ãã¨ãããã¨ãããã¯ããã§ãã¡ããã¡ãã«ãªãã¾ãã*2ã
glibc å®è£
精度ï¼
cbrt(3375.0)
ãè¨ç®ãã¦ã¿ãã¨ã14.9999999999999982236431605997495353221893310546875
ã«ãªãã¾ãããã¦ãã³ã ã
$3375 = 15^3$ ã§ããã$15-2^{-49}$ ãè¿ã£ã¦ãã¦ãã¦å«ãªæ°æã¡ã«ãªãã¾ããã
note: GCC ã§åã« cbrt(3375.0)
ã¨æ¸ã㨠15.0
ãåºåãããå ´åãããã¾ãããããã¯ã³ã³ãã¤ã«æã«è¨ç®ãã¦ããããã§ãï¼ã¢ã»ã³ããªãè¦ããããã¨ãããã¾ãï¼ãC ã®è¦æ ¼çã«ã¯ãã³ã³ãã¤ã«æã®è¨ç®ã¨å®è¡æã®è¨ç®ã§ç²¾åº¦ãªã©ã«éãããããã¨ã¯è¨±å®¹ããã¦ãã¾ããcbrt(strtod("15", NULL))
ãªã©ã¨ããã¨ãããããæé©åãé²ãããã§ããããã§ãé²ããªãã£ãå ´åã¯ãå®è¡æã«ä¸ããããã«ããã¨ããã§ããã
N2347 ããã®å¼ç¨
6.6/5
An expression that evaluates to a constant is required in several contexts. If a floating expression is evaluated in the translation environment, the arithmetic range and precision shall be at least as great as if the expression were being evaluated in the execution environment.
5.2.4.2.2/8
The accuracy of the floating-point operations (
+
,-
,*
,/
) and of the library functions in<math.h>
and<complex.h>
that return floating-point resuls is implementation-defined, as is the accuracy of the conversion between floating-point internal representations and string representations performed by the library functions in<stdio.h>
,<stdlib.h>
, and<wchar.h>
. The implementation may state that the accuracy is unknown.
ãããªç¡è²¬ä»»ãªãã$\eod$
19.7 Known Maximum Errors in Math Functions ã«ã¯ãglibc ã correct rounding ãªçµæãç®æãã¦ããããã§ã¯ãªãæ¨ããcrsin
ã®ããã« correct rounding çãç¨æãããããããªãæ¨ããæ¢ç¥ã®èª¤å·®ã®è¡¨ãªã©ãè¨è¼ããã¦ãã¾ãã
note: GCC (the GNU Compiler Collection) 㨠glibc (the GNU C Library) ã¯å¥ç©ã§ãããããæ¨æºé¢æ°ã¯ GCC ã§ã¯ãªã glibc ãæä¾ãã¦ãããã®ã§ããGCC ã¯ããã¾ã§ãï¼å¥éç¨æããã¦ããã¨ããã®ï¼glibc ã®é¢æ°ãå¼ã³åºãå®è¡ãã¡ã¤ã«ãä½ã£ã¦ããã ãã§ãã (cf. 4.14 Library Functions)ã
ã¾ããã
ãã¦ãcorrectly-rounded ã§ã¯ãªãã¨ç¥ã£ã¦ããæ°ã失ããã¦ãã人ãããããããã¾ããããä¸å¿å®è£ ãè¦ã«è¡ãã¾ãããã èªè ã®äººã ï¼ããæã®ãã³ã¡ããï¼ã¯æ°å¤è¨ç®ã®ã¢ã«ã´ãªãºã ã«æãããªãã®ã§ããã©ãã Taylor å±éã¨ãããã¦ããã§ããï¼ãã®ãããªã¼ãã¼ãã£ã¨ããã¤ã¡ã¼ã¸ããã¦ãããã¨ã¨æãã¾ãããããã§ã¯ãªãã§ãã
sysdeps/ieee754/dbl-64/s_cbrt.c (glibc-2.41) ãèªãã§ããã¾ãã
disclaimer: sysdeps é
ä¸ã®æ§é ããã¾ãã¡ããã£ã¦ããªãã§ããã¾ããæ°å¦é¢æ°ã®ã©ã¤ãã©ãªã®ãã¡ã¤ã«åã«ã¯ e_
k_
s_
t_
v_
w_
ãªã©ã® prefix ãã¤ãã¦ããã®ã§ãããããããªã«ãæå³ããã®ããããã£ã¦ããªãã§ããglibc 以å¤ã®æ°å¦é¢æ°ã®ã©ã¤ãã©ãªã§ãããããååã«ãªã£ã¦ãããããããæ
£ç¿ãããï¼or æã®ãããããã¸ã§ã¯ãããããã¦ããï¼ï¼ã¨ããªã®ããªãã¨æã£ã¦ãã¾ããw_
㯠wrapper ãªã®ããªã¨ããé°å²æ°ã¯æãã¦ãã¾ããk_
㯠kernel ãæå³ãã¦ããããªã®ãè¦ãè¨æ¶ã¯ããã¾ã*3ã
æ¹é
大ã¾ããªæ¹éã¯æ¬¡ã®éãã§ãã
$\gdef\quot{\operatorname{quot}}$ $\gdef\rem{\operatorname{rem}}$
- ${|x|} = x_m\times 2^{x_e}$ ã¨ãã¦å解ãããããã§ã$x_m\in[0.5\lldot 1)$ ã§ã$x_e$ ã¯æ´æ°ã§ããã
- $\sqrt[3]{|x|} = x_m^{1/3}\times 2^{x_e/3} = (x_m^{1/3}\cdot 2^{(x_e\rem 3)/3})\times 2^{x_e \quot 3}$ ã¨å¤å½¢ããããããã®é¨åãæ±ããã
- $\quot$ 㨠$\rem$ ã¯ãããã C ã®
/
ã¨%
ã«å¯¾å¿ããé¤ç®ã¨å°ä½ç®ãåã $0$ æ¹åã«ä¸¸ããããããã¾ããè² ã«ãªããã¨ãããã
- $\quot$ 㨠$\rem$ ã¯ãããã C ã®
$(x_m, x_e)$ ãæ±ããé¨åã¯ãfrexp
ã¨ããæ¨æºé¢æ°ã«ãã£ã¦è¡ãã¾ããããã¯ãå
é¨ã®ããã表ç¾ã®æä½ã«ãããã®ãªã®ã§ã誤差ãªãã§å¯è½ã§ãã
ãã®éã«ã$0_{\pm}$, $\pm\infty$ ã NaN ã§ãããã¨ã®å¤å®ãå¯è½ãªã®ã§ããããã®å ´åã¯ãã®ã¾ã¾è¿ãã¦ãã¾ãã¾ãã
å®æ°ã®è¨ç®
ãã¦ãæ¬é¡ã¨ãªãä¸è¨ã«ã¤ãã¦èãã¦ããã¾ãã $$ \sqrt[3]{|x|} = (x_m^{1/3}\cdot 2^{(x_e\rem 3)/3})\times 2^{x_e \quot 3}. $$ ã¾ãã$2^{(x_e\rem 3)/3}$ ã®é¨å㯠$2^{-2/3}$, $2^{-1/3}$, $2^{0/3}$, $2^{1/3}$, $2^{2/3}$ ã® 5 éããããªããããå®æ°ã¨ãã¦ç¨æãã¦ããã¾ãã $$ \begin{aligned} r_{-2} &= 0.{\small 629960524947436}{\footnotesize 484310969717625}{\scriptsize 994235277175903}{\tiny 3203125}, \\ r_{-1} &= 0.{\small 793700525984099}{\footnotesize 680698591328109}{\scriptsize 614551067352294}{\tiny 921875}, \\ r_0 &= 1, \\ r_1 &= 1.{\small 259921049894873}{\footnotesize 190666544360283}{\scriptsize 296555280685424}{\tiny 8046875}, \\ r_2 &= 1.{\small 587401051968199}{\footnotesize 583441787581250}{\scriptsize 537186861038208}{\tiny 0078125}. \end{aligned} $$
$\angled{r_1, r_2} = \angled{\roundp{\sqrt[3]{2}}, \roundp{\sqrt[3]{4}}}$ ã§ããã$\angled{r_{-2}, r_{-1}} = \angled{1\oslash r_2, 1\oslash r_1} \ne \angled{\roundp{\sqrt[3]{0.25}}, \roundp{\sqrt[3]{0.5}}}$ ã¨ãªã£ã¦ãã¾ãã
ãããã®å¤ã«é¢ãã¦
sysdeps/i386/fpu/s_cbrt.S ã§ãåæ§ã®ã¢ã«ã´ãªãºã ãã¢ã»ã³ããªã§æ¸ããã¦ãã¾ããããã¡ãã§ã¯ $\angled{r_{-2}, r_{-1}} = \angled{\roundp{\sqrt[3]{0.25}}, \roundp{\sqrt[3]{0.5}}}$ ã¨ãªã£ã¦ãããæå³ããå®ç¾©ã«ãªã£ã¦ããã®ãã¯å¾®å¦ãªæ°ããã¾ããã³ã³ãã¤ã«æè¨ç®ãªã©ã§å®ã¯ correctly-rounded ã®å¤ã«ãªãå¯è½æ§ãå¦å®ã¯ã§ãã¾ããããæå ã®ç°å¢ã§ã¯ããã¯ãªã£ã¦ããªãããã§ããã
volatile double x = 0.125; // ã³ã³ãã¤ã«æã«è¨ç®ãããã®ãé²ã cbrt(x);
ã¨ãã¦ã$0.5$ ã«ãªãã° $r_{-2} = \roundp{\sqrt[3]{0.25}}$ ã¨ãªã£ã¦ãã¾ãã
volatile double x = 0.25; cbrt(x);
ãã¡ãã¯ã$0.{\small 629960524947436}{\footnotesize 706355574642657}{\scriptsize 302320003509521}{\tiny 484375}$ ã«ãªãã° $r_{-1} = \roundp{\sqrt[3]{0.5}}$ ã¨ãªã£ã¦ãã¾ãããªãããã®ã¨ãã® cbrt(0.25)
ã®å¤ã¯ $\roundp{\sqrt[3]{0.25}}$ ã¨ã¯ç°ãªã£ã¦ãããã¨ã«æ³¨æãã¦ãã ãã ð¥²ã
$$ \begin{aligned} \roundp{\sqrt[3]{0.5}} &= 0.{\small 793700525984099}{\footnotesize 791720893790625}{\scriptsize 268593430519104}{\tiny 00390625}, \\ \roundp{\sqrt[3]{0.25}} &= 0.{\small 629960524947436}{\footnotesize 595333272180141}{\scriptsize 648277640342712}{\tiny 40234375}. \quad\eod \end{aligned} $$
è¿ä¼¼å¤é å¼
ãã¦ãæ®ã㯠$x_m^{1/3}$ ãæ±ãããã¼ãã§ãã å®ç¾©ãã $x_m\in[0.5\lldot1)$ ã§ãã ãã®ããã«ãå ¥åãç¹å®ã®åºéã«å«ã¾ããã±ã¼ã¹ã«å¸°çããææ³ã¯ããã以å¤ã®æ°å¦é¢æ°ã«ããã¦ããã°ãã°è¦ããã¾ãã
以ä¸ã§å®ç¾©ãããå¤é å¼ $f$ ãèãã¾ãã $$ \begin{aligned} f(x) &= 0.{\small 354895765043919}{\footnotesize 841907893442112}{\scriptsize 253978848457336}{\tiny 42578125} \\ &\qquad {}+ 1.{\small 508191937815849}{\footnotesize 037463067361386}{\scriptsize 492848396301269}{\tiny 53125}\,x \\ &\qquad {}- 2.{\small 114994941673713}{\footnotesize 046981220031739}{\scriptsize 212572574615478}{\tiny 515625}\,x^2 \\ &\qquad {}+ 2.{\small 446931225635344}{\footnotesize 375746171863283}{\scriptsize 962011337280273}{\tiny 4375}\,x^3 \\ &\qquad {}- 1.{\small 834692774836130}{\footnotesize 801929812150774}{\scriptsize 523615837097167}{\tiny 96875}\,x^4 \\ &\qquad {}+ 0.{\small 784932344976639}{\footnotesize 218003811038215}{\scriptsize 644657611846923}{\tiny 828125}\,x^5 \\ &\qquad {}- 0.{\small 145263899385486}{\footnotesize 366933051272098}{\scriptsize 964545875787734}{\tiny 9853515625}\,x^6. \end{aligned} $$
ãã® $f$ ã«å¯¾ã㦠$x_m^{1/3} \approx f(x_m)$ ãæãç«ã¡ã¾ãã $f(x_m)$ ã®è¨ç®ã®éã«ã¯ Hornerâs method ãç¨ãã¾ã*4ã$f$ ã®è¨ç®ã«ã誤差ãåºããããHornerâs method ã«ãã $f(x_m)$ ã®å¤ã¯ $\hat f(x_m)$ ã¨è¡¨è¨ãããã¨ã«ãã¾ãããã
ãã®å¤é å¼ã¯ããããã㯠Remez algorithm ãªã©ã§æ±ããã®ã ããã¨æ¨æ¸¬ãã¦ãã¾ããç¹å®ã®åºéã«ããã誤差ã®æ大å¤ãæå°åãããããªï¼äºã決ãã次æ°ä»¥ä¸ã®ï¼è¿ä¼¼å¤é å¼ãæ±ããã¢ã«ã´ãªãºã ã§ãã $x_m\in[0.5\lldot 1)$ ã¨ãã¦ããã®ã§ã$[0.5\lldot 1)$ ã§ã®ããè¿ä¼¼ãå¾ããã¦ããã°ããã§ããã
ç¹ç·ããã®å¢çãç ´ç·ãè¿ä¼¼ãããã¹ãçã®å¤ $y=x^{1/3}$ ã§ã赤ã®å®ç·ãä¸è¨ã®å¤é å¼ $y=\hat f(x)$ ã§ãããããããªè¦ãç®ããã¦ãã¾ããã
念ã®ããããå°ãè¿ã¥ãã¦ãã
$\gdef\signum{\operatorname{sgn}}$
ãã¦ãããå°ãã ãç¶ãã¾ãã$\signum(x)\times(\hat f(x_m)\otimes r_{x_e\rem 3})\times 2^{x_e\quot 3}$ ãè¿ãããã§ã¯ãªãã§ãã
è¿ãã®ã¯ã$u = \hat f(x_m)$ ããã³ $t_2 = u\otimes u\otimes u$ ã¨ãã¦ã次ã®å¤ã§ãã $$ \signum(x)\times (u \otimes (t_2 \oplus 2x_m)\oslash(2t_2\oplus x_m)\otimes r_{x_e\rem 3})\times 2^{x_e\quot 3} $$
ãã£ã±ã $\circledast$ ã®è¡¨è¨ã ã¨åæ°ã使ããªãã®ã§èªã¿ã«ãã ð¥²ã è¨ç®ããã¨ãã¦ããå¼ã®çµ¶å¯¾å¤ã¯æ¬¡ã®éãã§ãï¼$\signum(x)$ ã®é¨åã¯ç ©éã«ãªãã®ã§çãããã§ãï¼ã $$ u\cdot\frac{u^3+2x_m}{2u^3+x_m}\cdot r_{x_e\rem 3}\times 2^{x_e\quot 3} $$
$u \xgets{\times} \tfrac{u^3+2x_m}{2u^3+x_m}$ ã§æ´æ°ãã$u\cdot r_{x_e\rem 3}\times 2^{x_e\quot 3}$ ãè¿ããã¨ãã¦ããã¨ããè¦æ¹ãã§ãã¾ããã¨ããããã§ããã®æ´æ°ã«ã¤ãã¦è¦ã¦ããã¾ãã
ããã¯ãNewtonâs method ã§ã¯ãªã Halleyâs method ã¨å¼ã°ããå復ã¢ã«ã´ãªãºã ã®æ´æ°ã¹ãããã§ãã次ã®ãããªæ´æ°ããã¾ãã $$ x_{n+1} = x_n - \frac{2g(x_n)g'(x_n)}{2g'(x_n)^2-g(x_n)g''(x_n)} $$ ãã®å復ã«ããã$g(x) = 0$ ã®æ ¹ãæ±ãã¾ãã ãã¨ãã° $a$ ã® 3 ä¹æ ¹ãæ±ãããã¨ã㯠$g(x) = x^3-a$ ã¨ãã¦è¡ãã°ããã§ããã $g'(x) = 3x^2$, $g''(x) = 6x$ ã§ãã
$$ \begin{aligned} x_{n+1} &= x_n - \frac{2\cdot(x_n^3-a)\cdot 3x_n^2}{2\cdot(3x_n^2)^2-(x_n^3-a)\cdot 6x_n} \\ &= x_n - \frac{6x_n^5 - 6ax_n^2}{18x_n^4 - 6x_n^4+6ax_n} \\ &= x_n - \frac{x_n^4 - ax}{2x_n^3+a} \\ &= \frac{2x_n^4+ax_n-x^4+ax_n}{2x_n^3+a} \\ &= x_n\cdot \frac{x_n^3+2a}{2x_n^3+a} \end{aligned} $$ $(x_n, a) = (u, x_m)$ ã¨ãããã¨ã§ãä¸ã§è¦ãå¼ã¨ä¸è´ãã¾ãã
$u^3$ ã t2
ã¨ããååã«ããæå³ã¯ãããããã¾ããã§ãããä½ããã®ä¸è¬çãªææ³ã§ä½¿ããã¦ããè¨å·ãæµç¨ããã¨ãã§ããããã
å®æ
$\signum(x)\times u\cdot r_{x_e\rem 3}\times 2^{x_e\quot 3}$ ãè¿ãã¾ãã
æå¾ã® $2^{x_e\quot 3}$ ãæãããã¼ãã¯ãldexp
ã¨ããæ¨æºé¢æ°ã«ããè¡ãã¾ãã
ä½è«
ã ã£ãã $f$ ãªãã¦ä½¿ããã«æåãã Halleyâs method ã使ãã°ããããããã¨ãã声ãèããã¾ãã ããããã¯é¤ç®ãéãããé¿ãã¦ããã®ã§ã¯ãªãããªã¨æ¨æ¸¬ããã¨ããã§ãã
(xm, xe) = math.frexp(x) yi = math.ldexp(xm, xe // 3) for _ in range(4): yi3 = yi * yi * yi yi *= (yi3 + 2 * xi) / (2 * yi3 + xi) # yi3 = yi * yi * yi # yi3_xi = yi3 + xi # yi *= (yi3_xi + xi) / (yi3_xi + yi3)
$(0\lldot 2]$ ã®ç¯å²ã§ $10^{-5}$ å»ã¿ã§è©¦ããã¨ããã4 åã®å復ã§ã ããã $5\times 10^{-16}$ ç¨åº¦ã®ç¸å¯¾èª¤å·®ã«åã¾ã£ã¦ãããã§ããã å復ã 3 åã®ã¨ã㯠$6\times 10^{-6}$ ãããã§ããã3 次åæãããã®ã§ã1 åã®å復ã§ã ãã¶å·®ãåºã¾ããã
å復 1 åããã +
, *
, /
ããããã 2, 5, 1 åï¼è¨ç®é åºãå¤ã㦠yi3 + xm
å
ã«è¨ç®ãããã¨ã«ãã¦ã 3, 3, 1 åï¼ã§ãã
Hornerâs method ã«ãã $\hat f$ ã®è¨ç®åæ°ã¯ãããã 6, 6, 0 åï¼-
ã +
ã¨ãã¦è¨ä¸ï¼ãªã®ã§ãHalleyâs method 2 ååããããå¾ã§ãããé©å½ãªåæå¤ããå復ããããããå¤é
å¼ãç¨ãã¦è¨ç®ããæ¹ããå¾ã§ãã
Halleyâs method ã§åæããå¾ã®å¤ã«å¯¾ã㦠$r_{x_e\rem 3}$ ãæããã®ã¯ãæãã¦ãããããªæ°ãããªãã§ããªããããªæ°ããã¾ãã
ã¾ããNewtonâs method 㧠yi *= (2 * yi3 + xi) / (3 * yi3)
ãç¨ããå ´åã¯ãå復ã 7 åãã¦ã $4\times 10^{-12}$ ç¨åº¦ã®èª¤å·®ãããã¾ããã
åèæç®
ææ³
ä»å㯠glibc ã® cbrt
ãè¦ã¾ãããã¨ããã ãã®åã§ãããããã£ã±ãããã ãããæºè¶³ã§ããªãã¦ãï¼ä½¿ãéãã©ã®ç¨åº¦ããããªãã¦ã®ã¯ãã¦ããï¼correctly-rounded ãªå¤ãè¨ç®ã§ãããã¨ã«æ§ãã¾ãããã
競ããçéã«ããã¦ã¯ï¼ã¨ããã人éçã«ããã¦ã¯ï¼ãããããªæ¨æºé¢æ°ã®ç²¾åº¦ãæ°ã«ãããããæ®éã®ååæ¼ç®ã§ catastrophic cancellation ãèµ·ãããªãããã«æ°ãã¤ããæ¹ãå
ã§ãããã¨ããã±ã¼ã¹ã®æ¹ãå¤ãã®ã§ãcorrectly-rounded ãªãã¦ã®ã¯ã¾ã å
ã®å
ã®è©±ãããããªãã§ããã人éçã®äºæ
ãªãã¦ãã³ã¡ããã®ç¥ã£ããã¨ã§ã¯ãªãã§ããã
è¿ä¼¼å¤é å¼ $f$ ã天ä¸ãã§ä¸ãããã®ã使ã£ãã ããªã®ã§ãã¡ãã£ã¨ç©è¶³ããªãã¯ããã¾ãã Remez algorithm ã«ã¤ãã¦ãæ·±æãã§ããããããªã¨æã£ã¦ãã¾ãã
C ã IEEE 754ãPOSIX ã« C++ ã¨ããã¾ãã¾ãªè¦æ ¼ã§æãæãã®æ°å¦é¢æ°ãå®ç¾©ãã¦ããããã®ã§ããã¡ããã¡ããªåæ°ã®æ°å¦é¢æ°ãããã¾ããç¹ã« C++ ã¯ãããã¡ããã¡ãã§ãã
æ°å¦é¢æ°ãã¡
C ã®è¦æ ¼ã§å®ç¾©ããã¦ããæ°å¦é¢æ°ã«ã¯ä¸è¨ãããã¾ãããããæä½ãããã«é¡ãããã®ãªã©ã¯é¤å¤ãã¦ãã¾ãã
- trigonometric functions
- hyperbolic functions
acosh
$\arcosh(x)$,asinh
$\arsinh(x)$,atanh
$\artanh(x)$
- exponential and logarithmic functions
exp
$e^x$,exp2
$2^x$,expm1
$e^x-1$log
$\ln(x)$,log10
$\log_{10}(x)$,log1p
$\ln(1+x)$,log2
$\log_2(x)$
- power and absolute-value functions
cbrt
$x^{1/3}$fabs
$|x|$hypot
$\sqrt{x^2+y^2}$pow
$x^y$sqrt
$\sqrt x$
- error and gamma functions
erf
$\operatorname{erf}(x) = \displaystyle\frac2{\sqrt\pi}\int_0^x e^{-t^2}\,\mathrm{d}t$erfc
$\operatorname{erfc}(x) = 1 - \operatorname{erf}(x)$lgamma
$\ln(|\Gamma(x)|)$tgamma
$\Gamma(x)$
- nearest integer functions
ceil
$\ceil{x}$floor
$\floor{x}$round
,roundeven
,trunc
- floating multiply-add
fma
$(x\times y)+z$
IEEE Std 754-2019 ã® additional mathematical operations ã«ã¯ãä¸è¨ã®ãããªé¢æ°ãããã¾ãã
exp2m1
$2^x-1$,exp10
$10^x$,exp10m1
$10^x-1$log2p1
$\log_2(1+x)$,log10p1
$\log_10(1+x)$rSqrt
$1/\sqrt{x}$compound
$(1+x)^n$rootn
$x^{1/n}$sinPi
$\sin(\pi x)$,cosPi
$\cos(\pi x)$,tanPi
$\tan(\pi x)$asinPi
$\arcsin(x)/\pi$,acosPi
$\arccos(x)/\pi$,atanPi
$\arctan(x)/\pi$atan2Pi
POSIX ã«ã¯æ¬¡ã®é¢æ°ãããã¾ãã
- j0, j1, jn â Bessel functions of the first kind
- y0, y1, yn â Bessel functions of the second kind
C++ ã«ãããããããã¾ã (cf. [cmath.syn])ãåæã諦ãã¾ãããã¨ããã§ãããã¤ä½¿ããã§ããï¼ $\eod$
ããããå ¨é¨ã® correctly-rounded çãå®è£ ããããããã§ãã...ï¼ ðï¼correctly-rounded ã®æ¬è³ªã¯ãå®è£ ã§ã¯ãªã証æãã¼ãã¨ãã話ãããã¾ããï¼
ããã
ãããã§ãã
*1:èªåã®ä¸ããèããã¦ãã声ã§ããããããæµ®åå°æ°ç¹åã«èå³ãæã£ã¦ãããã©ãã®ãå°ãªãããã
*2:ç¾å®ã¨ãã¦ã¯ããããããã¡ããã¡ããªä½¿ãæ¹ãããã人ãå¤ãããªã®ã§ãããããä»æ§ã®æ¹ãã幸ç¦åº¦ããé«ããªãã®ããããã¾ããã...ããããã ad hoc ãªæå³ä¸æä»æ§ã«ã¯ãªã£ã¦ã»ãããªãã§ããã
*3:ãã¶ã Linux kernel ã¨ãã® kernel ã¨ã¯éãæèã§ããæ ¸ã¨ãªãé¨åã ããããããã ã¨è§£éãã¦ãã¾ãã
*4:$a_0+a_1x+a_2x^2+\cdots$ ãè¨ç®ããéã«ã$a_0\oplus (a_1\otimes x)\oplus(a_2\otimes x\otimes x) \oplus \cdots$ ã¨ããã®ã§ã¯ãªãã$( (\cdots\oplus a_2)\otimes x\oplus a_1)\otimes x\oplus a_0$ ã¨ããææ³ã