【问题标题】:acos and cos with degrees not giving proper resultacos 和 cos 的度数没有给出正确的结果
【发布时间】:2015-03-16 13:37:40
【问题描述】:

当我编写如下代码时

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 结果。
那么问题出在哪里呢?
请帮帮我

【问题讨论】:

    标签: ios objective-c math trigonometry


    【解决方案1】:

    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 的结果。

    【讨论】:

    • 你说对了一半。但是,您不应将输入转换为度数和弧度之间的 acos(),因为它不是角度。
    • 但是如何应用此解决方案或发出您在计算器项目中所说的任何内容?
    • @DuncanC,不确定你的意思。如果您的意思是“您不应该将角度作为参数提供给acos,我不是。我将cos 的返回值提供给acos
    • 凯文,我的错。我错过了你有 acos(cos(DEGREES_TO_RADIANS(1))) 的事实,所以弧度转换适用于余弦的输入,而不是 acos() 的输入。我收回我的评论。
    【解决方案2】:

    反余弦是余弦的倒数。

    余弦将角度作为输入,并返回从 -1 到 1 的值。 反余弦 (acos) 将一个从 -1 到 1 的值作为输入,并返回一个角度。

    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() 的结果转换为度数。 (而且Kevin的回答也是正确的,我的错)

    注意 cos(1) 有点奇怪,无论是度数还是弧度。这也不会给出一个均匀的答案。

    cos(0) = 1, cos(pi) = -1, cos(2pi) = 1。 (或度数) cos(180) = -1, cos(360) = 1)

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

    【讨论】:

    • 谁对我投了反对票?我的答案是正确的,而凯文的答案是不正确的。我没有拒绝凯文的回答,因为它部分正确。如果您认为我提供的信息不正确,请站出来说出来。
    • 我同意,我会还给你一个:)
    • 其实凯文的回答很完美。我没有注意到 OP 正在使用 acos(cos(1))。
    猜你喜欢
    • 1970-01-01
    • 2014-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-01
    • 1970-01-01
    相关资源
    最近更新 更多