почему этот метод греха возвращает неправильный ответ?
-
19-09-2019 - |
Вопрос
Привет, работая над некоторыми категориями, я столкнулся со странной проблемой. Я в основном расширяю класс калькулятора, чтобы добавить несколько триггерных методов, и получаю неправильное значение, когда вызываю метод 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;
}
Решение
Вы вычисляете грех в 100,7 радиан, и полученный ответ правильный.
Другие советы
Он ожидает радианы.Чтобы получить нужный ответ, сначала преобразуйте градусы в радианы:
// [radians] = [degrees] * [pi]/180
double theta = 100.7 * M_PI/180;
// sin(1.757 radians) == ~0.98
double result = sin(theta);
он ожидает радианы
По мнению Google, ответ правильный.Обратите внимание, что Google предполагает радианы.
Функция 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))