2012-10-19 2 views
10

"Complex Numbers"가 Objective-C에 이미 정의되어 있습니까?

- 복소수에 "i"를 추가하는 방법은 무엇입니까? Complex.m 파일에 "real"과 "imaginary"를 double 값으로 정의했을 때 Xcode는 "real"과 "imaginary"가 double 값이라는 것을 알고있었습니다.

- 예를 들어, "myComplex.imaginary = 7;"을 설정하면 main.m 파일의 복소수 끝 부분에 "i"를 추가하면 "myComplex.imaginary = 7i;"로 변경하십시오. 그 줄의 출력은 0.00000i가됩니다. 다른 글자를 추가하면 프로그램이 단순히 실행되지 않습니다. 왜 이럴까요?

기본적으로 "실제"와 "가상"의 의미가 Xcode에 이미 알려져 있기 때문에 내가 따르고있는 책은 이것을 지정하지 않았으므로 조금 혼란 스럽습니다.

또한이 코드는 내 서적 포럼 구성원에게서 복사 한 것이므로 직접 문제를 파악할 수 없으므로 다음 코드를 작성하지 않았습니다.

// Complex.h 

#include <Foundation/Foundation.h> 

@interface Complex : NSObject 
@property double real, imaginary; 
-(void) print; 
-(Complex *) add: (Complex *) complexNum; 
-(Complex *) subtract: (Complex *) complexNum; 
-(Complex *) multiply: (Complex *) complexNum; 
-(Complex *) divide: (Complex *) complexNum; 
@end 

// Complex.m 

#import "Complex.h" 

@implementation Complex 
@synthesize real, imaginary; 

-(void) print 
{ 
    NSLog(@"%f + %fi", real, imaginary); 
} 
-(Complex *) add: (Complex *) complexNum 
{ 
    Complex *result = [[Complex alloc]init]; 
    result.real = real + complexNum.real; 
    result.imaginary = imaginary + complexNum.imaginary; 
    return result; 
} 
-(Complex *) subtract: (Complex *) complexNum 
{ 
    Complex *result = [[Complex alloc]init]; 
    result.real = real - complexNum.real; 
    result.imaginary = imaginary - complexNum.imaginary; 
    return result; 
} 
-(Complex *) multiply: (Complex *) complexNum 
{ 
    Complex *result = [[Complex alloc]init]; 
    result.real = real * complexNum.real; 
    result.imaginary = imaginary * complexNum.imaginary; 
    return result; 
} 
-(Complex *) divide: (Complex *) complexNum 
{ 
    Complex *result = [[Complex alloc]init]; 
    result.real = real/complexNum.real; 
    result.imaginary = imaginary/complexNum.imaginary; 
    return result; 
} 
@end 

// 
// main.m 
// Complex 

#include <Foundation/Foundation.h> 
#import "Complex.h" 

int main(int argc, const char *argv[]) { 

    @autoreleasepool { 
     Complex *myComplex = [[Complex alloc]init]; 
     Complex *totalComplex = [[Complex alloc]init]; 
     Complex *yourComplex = [[Complex alloc]init]; 

     myComplex.real = 5.3; 
     myComplex.imaginary = 7; 
     [myComplex print]; 
     NSLog(@"+"); 

     yourComplex.real = 2.7; 
     yourComplex.imaginary = 4; 
     [yourComplex print]; 
     NSLog(@"="); 

     totalComplex = [myComplex add: yourComplex]; 
     [totalComplex print]; 
    } 
    return 0; 
} 
+5

와 거래 오 "나비"알고리즘에 유용 전환 계수 (복합 지수)를 계산하기위한 수업 방법이있다! 이해하기 어려운 영어로 된 n00b가 아닌 질문! 무슨 일 이니? (+1) –

답변

12

복소수 유형 오브젝티브 C 현대 버전의 수퍼 세트 인 C99 정의된다. The actual syntax is like : i 접미사는 extension coming from GCC입니다

#include <complex.h> 

... 

complex double z = 2.7 + 3.4*I; 
complex double w = 4.5 - 1.7*I; 
complex double t = z*w; 
printf("%g + %gi", creal(t), cimag(t)); 

있다. Xcode에서 사용되는 컴파일러 (clang)는 GCC와 호환되는 대부분의 기능을 가지고 있으므로 3.4i을 쓸 수 있으며 오류가 없습니다.


그리고 질문에 대한 ,

  • 어떻게 목표 - C는 "I"복소수에 추가 알고 있나요?

출력을 의미하는 경우 Objective-C는 "i"를 추가하지 않습니다. "myComplex.imaginary = 7;"그것은 "나"만이

-(void) print 
{ 
    NSLog(@"%f + %fi", real, imaginary); 
//    ^
} 
  • 내가 설정 한 경우에 말했다 있기 때문에 인쇄 "myComplex.imaginary = 7i;"로 변경하십시오. 7I는 허수이고 myComplex.imaginary은 "이중", 따라서 실제 수 있기 때문에 해당 행에 대한 출력 0.00000i

된다. C 표준은 실수와 허수를 변환 할 때 0이 될 것을 권장합니다 (C99 §G.4.2/1). 따라서 작성한 내용은 myComplex.imaginary = 0.0;입니다. 내가 다른 문자를 추가하면

  • , 프로그램은 단순히 실행되지 않습니다, 이것은 왜?

사실 당신은 7.0if 같은 것들을 쓸 수 있습니다. 다시 말하지만, 이것은 Objective-C가 채택한 C 것입니다.f을 추가하여 기본 유형 "double"에서 "float"로 10 진수를 입력 할 수 있으며 GCC는 i을 추가하여 실수를 허수로 변환 할 수있는 추가 기능을 추가합니다. 7.0x과 같은 기타 사항은 컴파일러가 무엇을 의미하는지 모르기 때문에 중지하게됩니다. x 의미합니다.

+0

하하, 그게 분명히 내가 너를 따라 잡을 수 없었다;) –

+0

고마워! 나는 완벽하게 이해하고 심지어 NSLog에서 "% fi"를 알아 차리지 못했으며, 다음 장으로 넘어갔습니다. – Ronald

7

C99에는 복소수에 대한 기본 지원이 추가되어 이제는 일반적인 부동 소수점 또는 정수처럼 쉽게 처리 할 수 ​​있습니다. 더 이상 못생긴 구조체! 숫자의 부동 소수점 표현을 사용하여 트릭을 수행하면 _Complex_I 및 이와 동등한 I 매크로는 실수를 곱하면 double complex 또는 float complex 유형의 숫자가됩니다 (complex은 새로운 유형 수정 자 키워드입니다. 또한 C99에서 소개 됨). 이 새로운 편의 기능과 함께, 당신은

#include <complex.h> 

double complex z1 = 2.0 + 3.0 * I; 
double complex z2 = 1.5 - 2.0 * I; 
double complex prod = z1 * z2; 

printf("Product = %f + %f\n", creal(prod), cimag(prod)); 

만큼 쉽게 C에서 복잡한 숫자 계산을 수행 할 수 있도록뿐만 아니라 이것에 대해 the GNU explanation을 확인하시기 바랍니다.

i 접미어는 C99 언어에 대한 GNU 확장이므로 비표준입니다. 그럼에도 불구하고 Xcode (GCC 및 Clang)에서 사용하는 두 컴파일러 모두이 확장을 구현합니다.

가 (. (!) 참고가 : 엑스 코드는 이것에 대해 아무것도을 알고 컴파일러와 IDE를 혼동하지 마십시오 엑스 코드 자체가 컴파일 수행하지 않습니다 - 그 뒤에 컴파일러가 수행하십시오..) 두 가지 심각한 실수가 있습니다

+0

감사합니다. GNU 설명의 방정식이 도움이되었습니다. – Ronald

1

클래스 복합체 구현 - 복소수가 곱 해져서 절대적으로 잘못된 방식으로 나뉩니다. 2 개의 복소수의 실수 부와 허수 부를 단순히 곱하거나 나누는 것만으로는 충분하지 않습니다. 이 경우 곱셈과 나누기 공식을 사용해야하는데, Google에 대한 항목이 많이 포함되어 있다고 생각합니다. 지금은 잘못된 코드이며 다시 작성해야합니다. 이

-(Complex *)mul:(Complex *)n 
{ 
    Complex *res = [[Complex alloc]init]; 
    res.re = re * n.re - im * n.im; 
    res.im = re * n.im + im * n.re; 
    return res; 
} 
2

같은

곱셈이 있어야합니다 뭔가 여기가 내 프로젝트의 목적을 위해 개발 한 복잡한 숫자와 운영을위한 클래스입니다. 누군가에게 유용 할 수 있습니다. 여기에는 표준 더하기, 빼기, 곱셈 및 나누기 방법이 포함됩니다. 또한 복소수의 모듈러스와 항을 계산하는 방법이 있습니다. 그리고, 마지막으로, 그것은 어떤 경우 고속 푸리에 변환 양해

#import <Foundation/Foundation.h> 

@interface Complex : NSObject 
@property double re, im; 
-(Complex *)add :(Complex *) n; 
-(Complex *)sub :(Complex *) n; 
-(Complex *)mul :(Complex *) n; 
-(Complex *)div :(Complex *) n; 
+(Complex *)wkn :(int) k :(int) n; 
-(double)mod; 
-(double)arg; 
@end 

#import "Complex.h" 

@implementation Complex 
@synthesize re, im; 
// Addition of two complex numbers 
-(Complex *)add:(Complex *)n 
{ 
    Complex *res = [[Complex alloc]init]; 
    res.re = re + n.re; 
    res.im = im + n.im; 
    return res; 
} 
// Subtraction of two complex numbers 
-(Complex *)sub:(Complex *)n 
{ 
    Complex *res = [[Complex alloc]init]; 
    res.re = re - n.re; 
    res.im = im - n.im; 
    return res; 
} 
// Multiplication of two complex numbers 
-(Complex *)mul:(Complex *)n 
{ 
    Complex *res = [[Complex alloc]init]; 
    res.re = re * n.re - im * n.im; 
    res.im = re * n.im + im * n.re; 
    return res; 
} 
// Division of two complex numbers 
-(Complex *)div: (Complex *)n 
{ 
    Complex *res = [[Complex alloc]init]; 
    double A = (pow(n.re, 2.0) + pow(n.im, 2.0)); 
    res.re = (re * n.re - im * n.im)/A; 
    res.im = (im * n.re - re * n.im)/A; 
    return res; 
} 
// Modulus of complex number 
-(double)mod 
{ 
    double res = sqrt(pow(re, 2.0) + pow(im, 2.0)); 
    return res; 
} 
// Argument of complex number 
-(double)arg 
{ 
    double res; int quad; 
    if (re == 0 && im > 0) res = M_PI_2; 
    else if (re == 0 && im < 0) res = 3 * M_PI_2; 
    else 
    { 
     if (re > 0 && im >= 0) quad = 1; 
     else if (re < 0 && im >= 0) quad = 2; 
     else if (re < 0 && im < 0) quad = 3; 
     else if (re > 0 && im < 0) quad = 4; 
     double temp = atan(im/re); 
     switch (quad) 
     { 
      case 1: 
       res = temp; 
       break; 
      case 4: 
       res = 2 * M_PI + temp; 
       break; 
      case 2: case 3: 
       res = M_PI + temp; 
       break; 
     } 
    } 
    return res; 
} 
// Turning factor calculation for "butterfly" FFT algorithm 
+(Complex *)wkn:(int)k :(int)n 
{ 
    Complex *res = [[Complex alloc]init]; 
    res.re = cos(2 * M_PI * k/n); 
    res.im = -sin(2 * M_PI * k/n); 
    return res; 
} 

@end 

감사)