acos和cos与度数没有给出正确的结果

时间:2015-03-16 13:37:40

标签: ios objective-c math cos

我写下面的代码时

NSLog(@"%f",acos(cos(1)));

它返回1作为结果但如果我试图从度而不是弧度获得结果然后面临问题如下

#define DEGREES_TO_RADIANS(angle) ((angle) / 180.0 * M_PI)
NSLog(@"%f",acos(cos(DEGREES_TO_RADIANS(1)))); 

然后它返回0.017453而不是1
如果我写下面的话

NSLog(@"%f",acos(cos(DEGREES_TO_RADIANS(1)))*180/M_PI);

然后我得到了正确的1
但如果我写下面的话

NSString *a1 = [NSString stringWithFormat:@"%f",(cos(DEGREES_TO_RADIANS(1)))];
NSString *a2 = [NSString stringWithFormat:@"%f",(acos([a1 doubleValue])*180/M_PI)];
NSLog(@"%f",[a2 doubleValue]);

然后我得到0.998999作为结果。
那么问题出在哪里?
请帮帮我

2 个答案:

答案 0 :(得分:5)

0.017453是指一度有多少弧度。

如果您希望日志记录行输出1,则需要转换回度数。

#define RADIANS_TO_DEGREES(angle) ((angle) * 180.0 / M_PI)
NSLog(@"%f", RADIANS_TO_DEGREES(acos(cos(DEGREES_TO_RADIANS(1)))));

请注意,由于三角函数的准确性有限以及一般浮点数,您可能得到0.9999的结果。

答案 1 :(得分:1)

Arc Cosine是余弦的倒数。

余弦采用角度作为输入,并返回-1到1之间的值。 Arc Cosine(acos)从-1到1取值作为输入,并返回一个角度。

acos()的输入不是角度,因此不应尝试在度和弧度之间进行转换。 结果是一个角度。这就是你转换的内容。

所以你会写

x = RADIANS_TO_DEGREES(acos(1))。

这将给出余弦为1的角度,以度表示。 (acos(1)的值为0,以度或弧度表示相同。)

最好使用acos(0)作为测试值。在pi / 2(或90度)时余弦函数= 0

所以

acos(0) == pi/2. (~1.5707)

RADIANS_TO_DEGREES(acos(0)) == 90.

编辑:

我现在看到你的问题是你正在服用acos(cos(DEGREES_TO_RADIANS(1)),这是正确的。

但是,如果您想要以度为单位的答案,仍然需要将acos()的结果转换为度数,如上所述。 (凯文的回答也是正确的。我的错误)

请注意,cos(1)在度和弧度上都有点奇怪。那也不会给出一个平坦的答案。

cos(0)= 1,cos(pi)= -1,cos(2pi)= 1。 (或以度为单位) cos(180)= -1,cos(360)= 1)

以度为单位的cos(1)将是一个奇怪的十进制值,因此以弧度为单位的cos(1)。