3

嘿,在一些类别上工作,我遇到了一个奇怪的问题,我基本上扩展了一个计算器类以添加一些三角方法,当我以返回的形式调用 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;
}
4

5 回答 5

12

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

于 2010-01-07T03:48:12.540 回答
10

它期待弧度。要获得您想要的答案,请先将度数转换为弧度:

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

// sin(1.757 radians) == ~0.98
double result = sin(theta);
于 2010-01-07T03:52:50.203 回答
5

它期待弧度

于 2010-01-07T03:47:33.613 回答
1

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

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

于 2010-01-07T03:48:54.440 回答
0

sin 函数需要弧度。如果要获得度数,则需要将度数转换为弧度。

你是怎么做到的?

简单的。

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

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

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

圆的整周长是多少?

好吧,π被定义为圆的周长与直径之间的比率。

什么是直径?

嗯,直径是半径的2倍。基本上,直径是一条穿过圆心并在该线与圆相交时结束的线。半径是一条从中心开始到圆结束的线。

所以

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

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

简单的

您将圆的周长除以半径。多田你得到 2πr/r=2π。

而那个 2π 相当于 360 度。

那么如果我们知道度数,我们怎么知道弧度呢?

很简单,我们乘以 2π 然后除以 360。

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

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

所以如果你有 107 度那 107

IS 107 度 * 1 = 107 度 * π 弧度/180 度。当然计算机不关心单位。最后变成 107 * π/180。

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

我会做的是我会宣布

#define radianperdegree (M_PI/180) 

现在,该值实际上并不是 1。但是,从概念上讲,如果我们考虑单位,弧度度确实是 1。那是因为 1 弧度远大于 1 度。

为了得到弧度的角度,我不能改变角度。我所做的是将它乘以一个概念上为 1 的数字。所以我乘以弧度。结果是一个小得多的数字。但是那个小得多的数字代表完全相同的角度。那是因为小得多的数字是以弧度为单位的角度大小,每个弧度都更大。

然后我做

double result = sin(100.7 * radianperdegree);

田……

清除?

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

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

然后使用 sin(DEGTORAD(107))

于 2012-08-13T06:16:46.947 回答