对于下面的代码,
- 如何不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;
}
复数类型定义在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
手段。
C99增加了原生支持复数,所以现在他们都容易处理,因为普通浮点或整数。 没有更多的丑陋结构! 大概用数字的浮点表示做技巧的_Complex_I
和相当于I
的宏有一个值,当由实数相乘,结果在许多类型的double complex
或float complex
( complex
是一种新的类型修饰符关键字,在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的本身不执行编辑-它背后的编译器做的。)
下面是类复杂的数字我已经为我的项目的目的而开发的操作系统。 可能这将是有用的人。 它包含了标准的加法,减法,乘法和除法的方法。 此外,它具有计算模量和复数参数方法。 而且,最后,它具有计算转弯因子(复指数)类方法是“蝴蝶”算法有用,当处理快速傅立叶变换
#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
谢谢你的耐心 )
有类复杂的实现两个严重的错误 - 复数相乘,并绝对错误的方式分! 这是绝对不够干脆乘或除两个复数的实部和虚部。 你必须使用乘法和分裂的公式在这种情况下,我认为谷歌包含了很多条目。 现在它是错误代码,它必须重写。
对于乘法它必须是这样的
-(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;
}