# cprojf, cproj, cprojl

< c‎ | numeric‎ | complex

定义于头文件 `<complex.h>` |  |
float complex cprojf( float complex z ); | (1) | (C99 起)
double complex cproj( double complex z ); | (2) | (C99 起)
long double complex cprojl( long double complex z ); | (3) | (C99 起)
定义于头文件 `<tgmath.h>` |  |
#define cproj( z ) | (4) | (C99 起)

1-3) 计算 `z` 在黎曼球面上的投影。
4) 泛型宏：若 `z` 拥有 long double complex 、 long double imaginary 或 long double 类型，则调用 `cprojl` 。若 `z` 拥有 float complex 、 float imaginary 或 float 类型，则调用 `cprojf` 。若 `z` 拥有 double complex 、 double imaginary 、 double 或任何整数类型，则调用 `cproj` 。

对于绝大多数 `z` ， cproj(z)==z ，但所有复无穷大，即使是一部为无穷大而另一部为 NaN 者，都变为正实无穷大， INFINITY+0.0*I 或 INFINITY-0.0*I 。虚部（零）的符号为 cimag(z) 的符号。

### 参数

z | - | 复参数

### 返回值

`z` 在黎曼球面上的投影。

此函数为所有可行输入完整指定，并且不受制于任何描述于 `math_errhandling` 的错误。

### 注解

`cproj` 函数通过将所有无穷大映射到一（给出或采用虚部零的符号），帮助用户模拟黎曼球面，而且它应该在任何操作，特别是比较之前使用，比较可能对任何其他无穷大给出虚假结果。

### 示例

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

    int main(void)
    {
        double complex z1 = cproj(1 + 2*I);
        printf("cproj(1+2i) = %.1f%+.1fi\n", creal(z1),cimag(z1));

        double complex z2 = cproj(INFINITY+2.0*I);
        printf("cproj(Inf+2i) = %.1f%+.1fi\n", creal(z2),cimag(z2));

        double complex z3 = cproj(INFINITY-2.0*I);
        printf("cproj(Inf-2i) = %.1f%+.1fi\n", creal(z3),cimag(z3));
    }

输出：

    cproj(1+2i) = 1.0+2.0i
    cproj(Inf+2i) = inf+0.0i
    cproj(Inf-2i) = inf-0.0i

### 引用

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

  - 7.3.9.5 The cproj functions (p: 198)

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

  - G.7 Type-generic math <tgmath.h> (p: 545)

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

  - 7.3.9.4 The cproj functions (p: 179)

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

  - G.7 Type-generic math <tgmath.h> (p: 480)

### 参阅