2010-01-07 5 views
3

Эй, работая над некоторыми категориями, и я столкнулся с какой-то странной проблемой, в основном расширяя класс калькулятора, чтобы добавить некоторые триггерные методы, и я получаю неправильное значение, когда я вызываю метод sin в возврате в форма двойной. Я отправляю значение 100.7 методу и возвращает 0.168231, из чего я могу видеть, что правильное значение должно быть = 0,939693 или там около.Почему этот метод греха возвращает неправильный ответ?

Heres код, я также прилагаю ссылку на полный проект здесь:

(спасибо)

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; 
} 
+1

«что я могу видеть правильное значение должно быть = 0,939693 или там О Нас» В самом деле? Зачем? Можете ли вы дать какое-либо обоснование этому? Считаете ли вы, что грех работает в градусах или радиан? –

+0

Я получил это, поставив его в калькулятор mac и онлайн-калькулятор, но, возможно, я ввел его неправильно, полюбите аватар btw, mein fuhrer! – nickthedude

+5

Забавный факт: исчисление является одной из причин того, что радианы являются «стандартными» аргументами в отношении греха. С углами в радианах d/dx sin (x) = cos (x). С углами в градусах вы получаете уродливый постоянный фактор, который только ухудшается с последующими производными :) – hobbs

ответ

12

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

+0

благодарит всех, что имеет смысл, мне действительно нужно освежить мой триггер и кистью, я имею в виду, чтобы узнать его в первый раз, какие-либо хорошие ресурсы, как это применимо к объективному - c и программированию в целом? – nickthedude

+2

Тригонометрия является языковой агностикой. – pavium

10

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

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

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

Для максимальной точности вы должны использовать предопределенную константу для pi, если ваш язык ее предоставляет. Например, в C это M_PI. –

0

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

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

Простой.

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

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

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

Какова полная окружность круга?

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

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

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

Так окружность

Circle является π * диаметр = π * 2 * радиус = 2π радиус. Это сокращается до 2πr, где r - радиус.

Итак, сколько радианов есть в круге?

Easy

Вы разделите окружность круга под с радиусом. Tada вы получили 2πr/r = 2π.

И что 2π эквивалентно 360 градусам.

Итак, если мы знаем степень, то откуда мы узнаем радиан?

Простой, умножаем на 2л, и мы разделим, что на 360.

Таким образом, мы умножаем все это на 2л/360 = я/180.

Способ увидеть, что радиан и степень являются «единицами». На каждые 180 градусов есть π радиан. Это означает, что π радиан/180 градусов является одним, потому что это отношение одного и того же числа.

Так что если у вас есть 107 степени, что 107

IS 107 градусов * 1 = 107 градусов * n радиан/180 градусов. Конечно, компьютер не заботится об устройстве. В конце получается 107 * π/180.

В Objective-c M_PI - константа, сохраняющая значение π.

Что бы я сделал, я бы объявить

#define radianperdegree (M_PI/180) 

Теперь значение не действительно 1. Однако концептуально radianperdegree действительно 1, если принять во внимание устройство. Это потому, что 1 радиан больше, чем 1 градус.

Чтобы получить угол в радиан, я не должен менять угол. То, что я делаю, я умножаю на число, которое является концептуально 1. Поэтому я умножаюсь на радианную шкалу. В результате получается гораздо меньшее число. Но это гораздо меньшее число представляет собой тот же самый угол. Это потому, что гораздо меньшее число - это размер угла в радине, и каждый радиан больше.

Тогда я

double result = sin(100.7 * radianperdegree); 

Тада .....

Ясно?

Другая вещь, которую вы можете сделать, это определить

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

И затем использовать грех (DEGTORAD (107))

Смежные вопросы