有“复数”在Objective-C已经定义?(Are “Complex Numbers” alrea

2019-07-01 09:52发布

对于下面的代码,

- 如何不Objective-C的知道要加一个“我”,以复数? 当我定义的“真实”与“虚”在我想通的Xcode只知道“真实”与“虚”是双值Complex.m文件双重价值。

- 如果我添加一个“i”设置为在main.m文件复数的结束,例如,如果我转“myComplex.imaginary = 7;” 成 “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;
}

Answer 1:

复数类型定义在C99 ,其目的-C的现代版是的超集。 实际的语法如下 :

#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));

i后缀是从GCC来扩展 。 由Xcode中使用的编译器(铛)的大多数功能是与GCC兼容,所以你可以写3.4i和没有错误。


而对于您的问题,

  • 如何Objective-C的知道要加一个“我”,以复数?

如果你指的输出,没有Objective-C的不知道要加一个“我”。 它打印出“我”只是因为你告诉它

-(void) print
{
    NSLog(@"%f + %fi", real, imaginary);
//                 ^
}
  • 如果我转 “myComplex.imaginary = 7;” 成 “myComplex.imaginary = 7i中;” 输出该行成为0.00000i

因为7I是虚数,并且myComplex.imaginary是一个“双”,从而数。 C标准建议,实部和虚数之间进行转换时,你会得到零(C99§G.4.2/ 1)。 因此,有效地你写的是什么myComplex.imaginary = 0.0;

  • 如果我添加任何其他字母,程序将根本无法运行,这是为什么?

其实你可以写东西像7.0if 。 再次,这是一个C的东西,它的Objective-C已经适应了。 你被允许添加一个f从默认型“双”到“浮动”变成一个十进制数,GCC增加了一个额外的功能,你可以添加一个i把一个实数虚数。 像其他的就足够了7.0x将导致编译停止,因为它不知道什么x手段。



Answer 2:

C99增加了原生支持复数,所以现在他们都容易处理,因为普通浮点或整数。 没有更多的丑陋结构! 大概用数字的浮点表示做技巧的_Complex_I和相当于I的宏有一个值,当由实数相乘,结果在许多类型的double complexfloat complexcomplex是一种新的类型修饰符关键字,在C99还推出)。 所以用这个新的便利功能,你可以一样容易执行C复合数计算

#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));

请检查GNU的解释关于这一点。

i的后缀是GNU扩展到C99语言,因此它是非标准。 尽管如此,Xcode中(GCC和锵)同时使用编译器实现了这个扩展。

(旁注:Xcode的一无所知此请不要混淆编译器的IDE Xcode的本身不执行编辑-它背后的编译器做的。)



Answer 3:

下面是类复杂的数字我已经为我的项目的目的而开发的操作系统。 可能这将是有用的人。 它包含了标准的加法,减法,乘法和除法的方法。 此外,它具有计算模量和复数参数方法。 而且,最后,它具有计算转弯因子(复指数)类方法是“蝴蝶”算法有用,当处理快速傅立叶变换

#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

谢谢你的耐心 )



Answer 4:

有类复杂的实现两个严重的错误 - 复数相乘,并绝对错误的方式分! 这是绝对不够干脆乘或除两个复数的实部和虚部。 你必须使用乘法和分裂的公式在这种情况下,我认为谷歌包含了很多条目。 现在它是错误代码,它必须重写。

对于乘法它必须是这样的

-(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;
}


文章来源: Are “Complex Numbers” already defined in Objective-C?