Objective c 为什么这个罪恶方法会返回错误的答案?

Objective c 为什么这个罪恶方法会返回错误的答案?,objective-c,xcode,class,trigonometry,calculator,Objective C,Xcode,Class,Trigonometry,Calculator,嘿,在处理一些类别时,我遇到了一个奇怪的问题,我基本上扩展了一个计算器类来添加一些trig方法,当我以double的形式调用返回中的sin方法时,我得到了一个错误的值。我给这个方法发送了一个100.7的值,它返回0.168231,根据我所看到的,正确的值应该是=0.939693,或者差不多 下面是代码,我还在这里附上完整项目的链接: (谢谢) // //计算器_trig.m //11.4\u计算器\u触发器 // //由Nicholas Iannone于2010年1月6日创作。 //版权所有2

嘿,在处理一些类别时,我遇到了一个奇怪的问题,我基本上扩展了一个计算器类来添加一些trig方法,当我以double的形式调用返回中的sin方法时,我得到了一个错误的值。我给这个方法发送了一个100.7的值,它返回0.168231,根据我所看到的,正确的值应该是=0.939693,或者差不多

下面是代码,我还在这里附上完整项目的链接:

(谢谢)

//
//计算器_trig.m
//11.4\u计算器\u触发器
//
//由Nicholas Iannone于2010年1月6日创作。
//版权所有2010年uu MyCompanyName uuu。版权所有。
//
#导入“Calculator\u trig.h”
#进口
@实现计算器(三角法)
-(双重)罪
{
双重结果;
结果=(双)sin(累加器);
返回结果;
}
-(双)cos
{
双重结果;
结果=cos(累加器);
返回结果;
}
-(双)谭
{
双重结果;
结果=tan(蓄能器);
返回结果;
}
@结束
#导入“Calculator.h”
@实现计算器
-(无效)设置累加器:(双)值
{
累加器=值;
}
-(无效)清除
{
累加器=0;
}
-(双)蓄能器
{
回流蓄能器;
}
-(双)记忆耳
{
内存=0;
NSLog(@“内存已被清除”);
回流蓄能器;
}
-(双)内存存储
{
存储器=累加器;
NSLog(@“内存已设置为%g”,内存);
回流蓄能器;
}
-(双)内存调用
{
累加器=存储器;
NSLog(@“累加器已设置为%g”,累加器);
回流蓄能器;
}
-(双)备忘录ADD
{
存储器+=累加器;
NSLog(@“累加器:%g已添加到内存,内存现在为%g”,累加器,内存);
回流蓄能器;
}
-(双)记忆子目录
{
存储器-=累加器;
NSLog(@“累加器:%g已从内存中减去,内存现在为%g”,累加器,内存);
回流蓄能器;
}
-(双)加:(双)值
{
累加器+=数值;
回流蓄能器;
}
-(双)减:(双)值
{
累加器-=值;
回流蓄能器;
}
-(双)乘:(双)值
{
累加器*=数值;
回流蓄能器;
}
-(双)除:(双)值
{
累加器/=数值;
回流蓄能器;
}
-(双重)变更标志
{
累加器=-累加器;
回流蓄能器;
}
-(双)对等
{
累加器=1/累加器;
回流蓄能器;
}
-(双)X平方
{
累加器*=累加器;
回流蓄能器;
}
@结束
#进口
#导入“Calculator.h”
#导入“Calculator\u trig.h”
int main(int argc,const char*argv[]{
NSAutoreleasePool*池=[[NSAutoreleasePool alloc]init];
计算器*myCalc=[[Calculator alloc]init];
双a=0;
[myCalc Set累加器:100.70];
a=[myCalc sin];
NSLog(@“累加器的sin=%f”,a);
[myCalc释放];
[泳池排水沟];
返回0;
}

它期望弧度

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

根据谷歌的说法,答案是正确的。请注意,谷歌采用弧度


它期望弧度。要获得所需答案,请先将度转换为弧度:

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

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

sin函数期望弧度。如果你想得到度,你需要将度转换成弧度

你是怎么做到的

简单

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

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

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

这个圆的周长是多少

π被定义为圆周长与直径之比

直径是多少

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

所以

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

那么,一个圆有多少弧度

轻松的

将圆的周长除以半径。塔达,你得到了2πr/r=2π

2π等于360度

如果我们知道度,我们怎么知道弧度

简单地说,我们乘以2π,再除以360

所以我们用2π/360=π/180乘以整件事

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

如果你有107度,那就是107度

是107度*1=107度*π弧度/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)

然后使用sin(DEGTORAD(107))

“我能看到的正确值应该是=0.939693或大约”真的吗?为什么?你能提供任何理由吗?你认为sin是以度或弧度计算的吗?我把它放在mac计算器和在线网络计算器中得到的,但也许我输入错了,顺便说一句,我喜欢阿凡达,
#define RADTODEG(x) ((x) * 57.29578)
#define DEGTORAD(x) ((x) / 57.29578)