为什么这种罪恶方法会回答错误的答案?

时间:2010-01-07 03:44:36

标签: objective-c xcode class trigonometry calculator

嘿,在一些类别上工作,我遇到了一个奇怪的问题,我基本上在计算器类上扩展以添加一些trig方法,当我在返回时调用sin方法时,我得到的值不正确双重的形式。我向方法发送一个值100.7,它返回0.168231,从我可以看到正确的值应该是= 0.939693或那里。

继承代码,我还在这里附上了一个完整项目的链接:

(感谢)

http://files.me.com/knyck2/svpfd4

//
//  Calculator_trig.m
//  11.4_calculator_trig
//
//  Created by Nicholas Iannone on 1/6/10.
//  Copyright 2010 __MyCompanyName__. All rights reserved.
//

#import "Calculator_trig.h"
#import <math.h>

@implementation Calculator (Trigonometry)

-(double) sin
{
 double result;

 result =   (double) sin (accumulator);

 return result;

}
-(double) cos
{
 double result;

 result =  cos ( accumulator);

 return result;
}
-(double) tan
{
 double result;

 result =  tan ( accumulator);

 return result;
}

@end

    #import "Calculator.h"


@implementation Calculator
-(void) setAccumulator: (double) value
{
 accumulator = value;
}

-(void) clear
{
 accumulator = 0;
}

-(double) accumulator
{
 return accumulator;
}

-(double) memoryClear
{
 memory = 0;
 NSLog(@"memory has been cleared");
 return accumulator;
}

-(double) memoryStore
{
 memory = accumulator;
 NSLog(@"memory has been set to %g", memory);
 return accumulator;
}

-(double) memoryRecall
{
 accumulator = memory;
 NSLog(@"accumulator has been set to %g", accumulator);
 return accumulator;
}

-(double) memoryAdd
{
 memory += accumulator;
 NSLog(@"accumulator: %g has been added to memory, memory is now %g", accumulator, memory);
 return accumulator;
}

-(double) memorySubtract
{
 memory -= accumulator;
 NSLog(@"accumulator: %g has been subtracted from memory, memory is now %g", accumulator, memory);
 return accumulator;
}

-(double) add: (double) value
{
 accumulator += value;
 return accumulator;
}

-(double) subtract: (double) value
{
 accumulator -= value;
 return accumulator;
}

-(double) multiply: (double) value
{
 accumulator *= value;
 return accumulator;
}

-(double) divide: (double) value
{
 accumulator /= value;
 return accumulator;
}

-(double) changeSign
{
 accumulator = -accumulator; 
 return accumulator;
}

-(double) reciprocal
{
 accumulator = 1 / accumulator;
 return accumulator;
}

-(double) xSquared
{
 accumulator *= accumulator;
 return accumulator;
}
@end

    #import <Foundation/Foundation.h>
#import "Calculator.h"
#import "Calculator_trig.h"

int main (int argc, const char * argv[]) {
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

    Calculator *myCalc = [[Calculator alloc] init];

 double a = 0;

 [myCalc setAccumulator: 100.70];
 a = [myCalc sin];

 NSLog(@" sin of accumulator = %f", a);

 [myCalc release];
    [pool drain];
    return 0;
}

5 个答案:

答案 0 :(得分:12)

你正在计算100.7弧度的罪,给出的答案是正确的。

答案 1 :(得分:10)

期待弧度。要获得所需的答案,请首先将度数转换为弧度:

// [radians] = [degrees] * [pi]/180
double theta = 100.7 * M_PI/180;

// sin(1.757 radians) == ~0.98
double result = sin(theta);

答案 2 :(得分:5)

它期待弧度

答案 3 :(得分:1)

根据谷歌的说法,答案是正确的。注意谷歌假设弧度。

http://www.google.com/search?hl=en&q=sin+of+100.7

答案 4 :(得分:0)

sin函数期待弧度。如果你想获得学位,你需要将学位转换为弧度。

你是怎么做到的?

简单。

在圆圈中有360度。有多少弧度?

Radian定义为角度前面的弧长除以半径之间的比率。

因此,对于一个完整的圆,圆弧的长度就是圆的圆周。

圆圈的整周是多少?

嗯,π定义为圆周长与直径之比。

什么是直径?

嗯,直径是半径的2倍。基本上直径是穿过圆心的线,当线与圆相交时结束。半径是从中心开始并以圆圈结束的线。

所以

圆的周长是π*直径=π* 2 *半径=2π半径。这缩短为2πr,其中r是半径。

那么,一个圆圈中有多少个弧度?

将圆的圆周除以半径。田田你有2πr/ r =2π。

那2π相当于360度。

所以如果我们知道学位,我们怎么知道弧度?

简单,我们乘以2π然后将它除以360.

所以我们将整个事物乘以2π/ 360 =π/ 180。

一种看待这种情况的方法是想象弧度和度数是“单位”。每180度有π弧度。这意味着π弧度/ 180度是1,因为它们是完全相同数字的比率。

所以,如果你有107度,那107

IS 107度* 1 = 107度*π弧度/ 180度。当然电脑不关心单位。最后它变成107 *π/ 180。

在Objective-c中,M_PI是一个存储π的值的常量。

我会做的是宣布

#define radianperdegree (M_PI/180) 

现在,值不是真的1.但是,从概念上讲,如果我们考虑单位,radianperdegree确实是1。那是因为1弧度大于1度。

要获得弧度的角度,我不能改变角度。我所做的是将其乘以一个概念为1的数字。所以我乘以radianperdegree。结果是一个小得多的数字。但是,这个小得多的数字代表完全相同的角度。这是因为更小的数字是弧度的角度大小,每个弧度更大。

然后我做

double result = sin(100.7 * radianperdegree);

多田.....

清除?

您可以做的另一件事是定义

#define RADTODEG(x) ((x) * 57.29578)
#define DEGTORAD(x) ((x) / 57.29578)

然后使用罪(DEGTORAD(107))