我写下面的代码时
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
作为结果。
那么问题出在哪里?
请帮帮我
答案 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)。