# cbrt, cbrtf, cbrtl

< c‎ | numeric‎ | math

定义于头文件 `<math.h>` |  |
float cbrtf( float arg ); | (1) | (C99 起)
double cbrt( double arg ); | (2) | (C99 起)
long double cbrtl( long double arg ); | (3) | (C99 起)
定义于头文件 `<tgmath.h>` |  |
#define cbrt( arg ) | (4) | (C99 起)

1-3) 计算 `arg` 的立方根。
4) 泛型宏：若 `arg` 拥有 long double 类型，则调用 `cbrtl` 。否则，若 `arg` 拥有整数类型或 double 类型，则调用 `cbrt` 。否则，调用 `cbrtf` 。

### 参数

arg | - | 浮点值

### 返回值

若不出现错误，则返回 `arg` 的立方根（ \(\small{\sqrt[3]{arg} }\)3√arg ）。

若出现下溢所致的错误，则返回（舍入后的）正确结果。

### 错误处理

报告 `math_errhandling` 中指定的错误。

若实现支持 IEEE 浮点算术（ IEC 60559 ），则

- 若参数为 ±0 或 ±∞ ，则返回不更改的参数
- 若参数为 NaN ，则返回 NaN 。

### 注解

cbrt(arg) 不等价于 pow(arg, 1.0/3) ，因为有理数 \(\small{\frac1{3} }\)

1
3

通常不等于 1.0/3 并且 pow 不能求负底数的小数次幂。另外 cbrt(arg) 常给出比 pow(arg, 1.0/3) 更精确的结果（见示例）。

### 示例

    #include <stdio.h>
    #include <math.h>

    int main(void)
    {
        // 正常使用
        printf("cbrt(729) = %f\n", cbrt(729));
        printf("cbrt(-0.125) = %f\n", cbrt(-0.125));
        // 特殊值
        printf("cbrt(-0) = %f\n", cbrt(-0.0));
        printf("cbrt(+inf) = %f\n", cbrt(INFINITY));
        // 精度
        printf("cbrt(343)      = %.*f\n", DBL_DECIMAL_DIG, cbrt(343));
        printf("pow(343,1.0/3) = %.*f\n", DBL_DECIMAL_DIG, pow(343, 1.0/3));
    }

可能的输出：

    cbrt(729) = 9.000000
    cbrt(-0.125) = -0.500000
    cbrt(-0) = -0.000000
    cbrt(+inf) = inf
    cbrt(343)      = 7.00000000000000000
    pow(343,1.0/3) = 6.99999999999999911

### 引用

- C11 标准（ISO/IEC 9899:2011）：

  - 7.12.7.1 The cbrt functions (p: 247)

  - 7.25 Type-generic math <tgmath.h> (p: 373-375)

  - F.10.4.1 The cbrt functions (p: 524)

- C99 标准（ISO/IEC 9899:1999）：

  - 7.12.7.1 The cbrt functions (p: 228)

  - 7.22 Type-generic math <tgmath.h> (p: 335-337)

  - F.9.4.1 The cbrt functions (p: 460)

### 参阅

pow powf powl (C99)(C99) | 计算一个数的给定次幂（ \(\small{x^y}\)xy ） (函数)
sqrt sqrtf sqrtl (C99)(C99) | 计算平方根（ \(\small{\sqrt{x} }\)√x ） (函数)
hypot hypotf hypotl (C99)(C99)(C99) | 计算两个给定数平方和的平方根 （ \(\scriptsize{\sqrt{x^2+y^2} }\)√x2 +y2 ） (函数)