почему этот метод греха возвращает неправильный ответ?

Эй, работаю над некоторыми категориями, и я столкнулся со странной проблемой, я в основном расширяю класс калькулятора, чтобы добавить некоторые триггерные методы, и я получаю неправильное значение, когда я вызываю метод 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;
}

person nickthedude    schedule 07.01.2010    source источник
comment
что я вижу, правильное значение должно быть = 0,939693 или примерно так? Почему? Можете ли вы предоставить этому какое-либо обоснование? Как вы думаете, грех работает в градусах или радианах?   -  person S.Lott    schedule 07.01.2010
comment
я получил это, вставив его в калькулятор Mac и онлайн-калькулятор, но, возможно, я ввел его неправильно, кстати, люблю аватар, майн фюрер!   -  person nickthedude    schedule 07.01.2010
comment
Забавный факт: исчисление — одна из причин, по которой радианы являются стандартом для аргумента греха. С углами в радианах d/dx sin(x) = cos(x). С углами в градусах вы получаете уродливый постоянный фактор, который только ухудшается с последовательными производными :)   -  person hobbs    schedule 07.01.2010


Ответы (5)


Вы вычисляете грех в 100,7 радиана, и дан правильный ответ.

person Hamish Grubijan    schedule 07.01.2010
comment
спасибо всем, это имеет смысл, мне действительно нужно освежить свои триггеры, и под освежением я подразумеваю изучение этого в первый раз, какие-нибудь хорошие ресурсы, применимые к цели - c и программированию в целом? - person nickthedude; 07.01.2010
comment
Тригонометрия не зависит от языка. - person pavium; 07.01.2010

Он ожидает радианы. Чтобы получить нужный ответ, сначала преобразуйте градусы в радианы:

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

// sin(1.757 radians) == ~0.98
double result = sin(theta);
person John Feminella    schedule 07.01.2010
comment
Для максимальной точности следует использовать предопределенную константу для числа пи, если она предусмотрена в вашем языке. Например, в C это M_PI. - person Eric Skroch; 07.01.2010

он ожидает радианы

person Jimmy    schedule 07.01.2010

Согласно гуглу, ответ правильный. Обратите внимание, что Google использует радианы.

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

person James Lawruk    schedule 07.01.2010

Функция sin ожидает радианы. Если вы хотите получить степень, вам нужно преобразовать градусы в радианы.

Как вы это делаете?

Простой.

В круге 360 градусов. Сколько там радиан?

Радиан определяется как отношение длины дуги перед углом к ​​радиусу.

Итак, для полного круга длина дуги - это просто длина окружности круга.

Чему равна полная длина окружности?

Ну, π определяется как отношение длины окружности к диаметру.

Что такое диаметр?

Ну диаметр в 2 раза больше радиуса. В основном диаметр - это линия, которая проходит через центр круга и заканчивается, когда линия пересекает круг. Радиус — это линия, начинающаяся в центре и заканчивающаяся на окружности.

So

Длина окружности равна π * диаметр = π * 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))

person user4951    schedule 13.08.2012