source

C의 복소수를 사용하는 방법

gigabyte 2022. 8. 30. 22:23
반응형

C의 복소수를 사용하는 방법

C의 복소수로 작업하려면 어떻게 해야 하나요?아, 그렇구나.complex.h헤더 파일 사용법에 대한 정보는 별로 없습니다.어떻게 하면 실제 부품과 가상의 부품에 효율적으로 접근할 수 있을까요?모듈 및 위상을 얻기 위한 네이티브 기능이 있습니까?

이 코드가 도움이 될 것입니다.또, 매우 알기 쉬운 코드입니다.

#include <stdio.h>      /* Standard Library of Input and Output */
#include <complex.h>    /* Standard Library of Complex Numbers */

int main() {

    double complex z1 = 1.0 + 3.0 * I;
    double complex z2 = 1.0 - 4.0 * I;

    printf("Working with complex numbers:\n\v");

    printf("Starting values: Z1 = %.2f + %.2fi\tZ2 = %.2f %+.2fi\n", creal(z1), cimag(z1), creal(z2), cimag(z2));

    double complex sum = z1 + z2;
    printf("The sum: Z1 + Z2 = %.2f %+.2fi\n", creal(sum), cimag(sum));

    double complex difference = z1 - z2;
    printf("The difference: Z1 - Z2 = %.2f %+.2fi\n", creal(difference), cimag(difference));

    double complex product = z1 * z2;
    printf("The product: Z1 x Z2 = %.2f %+.2fi\n", creal(product), cimag(product));

    double complex quotient = z1 / z2;
    printf("The quotient: Z1 / Z2 = %.2f %+.2fi\n", creal(quotient), cimag(quotient));

    double complex conjugate = conj(z1);
    printf("The conjugate of Z1 = %.2f %+.2fi\n", creal(conjugate), cimag(conjugate));

    return 0;
}

포함:

creal(z1): 실제 부품을 입수합니다(플로트용).crealf(z1), 긴 2배 동안creall(z1))

cimag(z1): 가상 부품을 가져옵니다(플로트용).cimagf(z1), 긴 2배 동안cimagl(z1))

복소수를 다룰 때 기억해야 할 또 다른 중요한 점은 다음과 같은 함수입니다.cos(),exp()그리고.sqrt()복잡한 형태로 대체해야 합니다.ccos(),cexp(),csqrt().

편의상 다음을 포함할 수 있습니다.tgmath.hgenerate macros 타입의 라이브러리.모든 유형의 변수에 대해 이중 버전과 동일한 함수 이름을 생성합니다.예를 들어 다음과 같이 정의됩니다.sqrt()로 확장되는 매크로sqrtf(),sqrt(), 또는sqrtl()함수(지정된 인수 유형에 따라 다름)

따라서 다른 유형의 변수에 대해 해당 함수 이름을 기억할 필요가 없습니다.

#include <stdio.h>
#include <tgmath.h>//for the type generate macros. 
#include <complex.h>//for easier declare complex variables and complex unit I

int main(void)
{
    double complex z1=1./4.*M_PI+1./4.*M_PI*I;//M_PI is just pi=3.1415...
    double complex z2, z3, z4, z5; 

    z2=exp(z1);
    z3=sin(z1);
    z4=sqrt(z1);
    z5=log(z1);

    printf("exp(z1)=%lf + %lf I\n", creal(z2),cimag(z2));
    printf("sin(z1)=%lf + %lf I\n", creal(z3),cimag(z3));
    printf("sqrt(z1)=%lf + %lf I\n", creal(z4),cimag(z4));
    printf("log(z1)=%lf + %lf I\n", creal(z5),cimag(z5));

    return 0;
}

복잡한 유형은 C99 표준 이후 C 언어로 되어 있습니다(-std=c99GCC 옵션)을 클릭합니다.컴파일러에 따라서는, 보다 초기의 모드에서도 복잡한 타입을 실장하는 경우가 있습니다만, 이것은 비표준 및 포터블 확장자(예를 들면, IBM XL, GCC, intel, ...)입니다.

http://en.wikipedia.org/wiki/Complex.h 에서 시작할 수 있습니다.complex.h 의 함수에 대한 설명이 표시됩니다.

이 매뉴얼 http://pubs.opengroup.org/onlinepubs/009604499/basedefs/complex.h.html에서는 매크로에 대한 정보도 제공합니다.

복합 변수를 선언하려면

  double _Complex  a;        // use c* functions without suffix

또는

  float _Complex   b;        // use c*f functions - with f suffix
  long double _Complex c;    // use c*l functions - with l suffix

복합체에 가치를 부여하려면_Complex_I에서 매크로하다.complex.h:

  float _Complex d = 2.0f + 2.0f*_Complex_I;

(실제로 여기에 문제가 있을 수 있습니다)(0,-0i)복잡한 단일 절반의 수치와 NaN)

모듈은cabs(a)/cabsl(c)/cabsf(b); 진짜 부분은creal(a), 상상은cimag(a).carg(a)복잡한 논쟁을 위한 것입니다.

실제 이미지 부품에 직접 액세스(읽기/쓰기)하려면 다음 휴대용 GCC 확장 기능을 사용할 수 있습니다.

 __real__ a = 1.4;
 __imag__ a = 2.0;
 float b = __real__ a;

복소수의 개념은 수학에서 음의 2차 근을 계산할 필요성으로부터 도입되었다.복소수 개념은 다양한 공학 분야에서 채택되었습니다.

오늘날 복소수는 물리학, 전자, 역학, 천문학 등과 같은 고급 공학 분야에서 널리 사용되고 있습니다.

음의 제곱근 예제의 실수 및 허수 부분:

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

int main() 
{
    int negNum;

    printf("Calculate negative square roots:\n"
           "Enter negative number:");

    scanf("%d", &negNum);

    double complex negSqrt = csqrt(negNum);

    double pReal = creal(negSqrt);
    double pImag = cimag(negSqrt);

    printf("\nReal part %f, imaginary part %f"
           ", for negative square root.(%d)",
           pReal, pImag, negNum);

    return 0;
}

z 라고합니다.__real__ z를 사용합니다.__imag__z상상의 부분을 추출하는 거죠.

예를 들어,

__complex__ float z;
float r;
float i;
r = __real__ z;
i = __imag__ z;

r은 복소수 z의 실수 부분 i는 복소수 z의 허수 부분이다.

언급URL : https://stackoverflow.com/questions/6418807/how-to-work-with-complex-numbers-in-c

반응형