具有度数的 acos 和 cos 没有给出正确的结果
acos and cos with degrees not giving proper result
当我编写如下代码时
NSLog(@"%f",acos(cos(1)));
结果是 returns 1
但是如果我试图从度数而不是弧度获得结果然后面临如下问题
#define DEGREES_TO_RADIANS(angle) ((angle) / 180.0 * M_PI)
NSLog(@"%f",acos(cos(DEGREES_TO_RADIANS(1))));
然后returns0.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.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 的结果。
反余弦是余弦的倒数。
余弦以角度作为输入,returns取-1到1之间的值。
反余弦 (acos) 取一个从 -1 到 1 的值作为输入,returns 一个角度。
acos() 的输入不是角度,因此您不应尝试在度数和弧度之间进行转换。 结果是一个角度。这就是你转换的内容。
所以你会写
x = RADIANS_TO_DEGREES(acos(1)).
这将为您提供余弦为 1 的角度,以度数表示。 (acos(1)的值为0,无论是度数还是弧度都是一样的。)
最好使用acos(0)作为测试值。余弦函数 = 0 在 pi/2(或 90 度。)
所以
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) 也是如此。
当我编写如下代码时
NSLog(@"%f",acos(cos(1)));
结果是 returns 1
但是如果我试图从度数而不是弧度获得结果然后面临如下问题
#define DEGREES_TO_RADIANS(angle) ((angle) / 180.0 * M_PI)
NSLog(@"%f",acos(cos(DEGREES_TO_RADIANS(1))));
然后returns0.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.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 的结果。
反余弦是余弦的倒数。
余弦以角度作为输入,returns取-1到1之间的值。 反余弦 (acos) 取一个从 -1 到 1 的值作为输入,returns 一个角度。
acos() 的输入不是角度,因此您不应尝试在度数和弧度之间进行转换。 结果是一个角度。这就是你转换的内容。
所以你会写
x = RADIANS_TO_DEGREES(acos(1)).
这将为您提供余弦为 1 的角度,以度数表示。 (acos(1)的值为0,无论是度数还是弧度都是一样的。)
最好使用acos(0)作为测试值。余弦函数 = 0 在 pi/2(或 90 度。)
所以
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) 也是如此。