【问题标题】:Obj-C Calculator - Radians to DegreesObj-C 计算器 - 弧度到度数
【发布时间】:2011-06-29 21:23:26
【问题描述】:

我一直在观看斯坦福 CS193P 的讲座,并且一直在研究作业计算器。我相当轻松地完成了第一个作业,我现在正努力为作业做额外的功劳。然而,我被一个额外的信用问题困住了:

实现一个用户界面来选择 sin() 或 cos() 的操作数是 考虑弧度或度数。在 C 库中调用 sin(x) 时,假定 x 以弧度表示(即 0 到 2π 绕一圈),但用户可能想要 输入 180 并按下 sin 按钮,得到 0 而不是 -0.8012(这是 180 弧度)。您可以为此使用 UIButton 并切换 titleLabel 的 每次按下 UIButton 时都会显示文本,但更好的方法是查看是否可以 通过阅读文档了解如何使用 UISwitch(如果你敢的话!)。

我实现了一个 UISwitch 并将其连接为一个 IBOutlet。当我执行“操作”时,我会检查开关是打开还是关闭,并将其与要执行的操作一起传递给我的模型。在我的 sin 和 cos 案例中,我执行以下操作:

else if ([operation isEqual:@"sin"])
{
    if (radians) {
        operand = sin(operand);
    }
    else {
        operand = sin(operand) * (180 / M_PI);
    }

}
// similar for cos

如果radians(这是一个BOOL:YES = 弧度,no = 度数),那么我照常执行操作;如果用户将开关置于“度”,我想以度为单位返回值,因为分配状态:用户可能想要输入 180 并按下 sin 按钮并得到 0 而不是 -0.8012(这是180 弧度的正弦)。

但是,此代码不能完全正常工作。当我将开关置于度数并执行sin 180 时,它返回的值或多或少-45。那里出了点问题;我不确定是什么。我已经查找了如何进行转换,我认为我做对了,但显然不是。

我意识到这可能更适合 math.stackexchange,但由于我想发布一些代码,所以我把它放在这里。有人可以就实现这一点的最佳方式提供一些建议吗?我已经有一段时间没有使用 cos 或 sin、弧度和度数了。

谢谢!

【问题讨论】:

  • 我重新标记为家庭作业,但后来我意识到你这样做是为了好玩。希望我没有毁掉任何东西。
  • 没关系;无论如何,这是一个家庭作业问题。别担心!

标签: objective-c ios trigonometry


【解决方案1】:

你的意思是operand = sin(operand * M_PI / 180);吗?

【讨论】:

  • 当我做 180 度的罪时,它仍然不会返回 1。我在这里很困惑,哈哈。
  • sin 180 度应该为零。因为 180 度是 1。
  • 是的,我误读了作业所说的内容。是一个错字,我的意思是 0。无论如何,它返回一个浮点数。 122465e-16.
  • 该特定浮点表示舍入误差。这足够接近 0。
  • 我仍然使用 CGFloat 获得 1.22465e-16。有没有办法让这个0?对这些东西有点陌生。
【解决方案2】:

试试这个 - 它对我有用:

    if ([operation isEqual:@"sin"])
    {
        operand = (operand * M_PI/180); // first convert the operand from radians to degrees then perform the operation
        operand = sin(operand);
    }

希望对你有帮助

【讨论】:

    【解决方案3】:

    你在哪里定义操作数?

    您确定 operand 是 CGFloat 而不是内存地址吗?

    你是如何格式化你的输出的?如果您使用 %e,它将以科学计数法输出...尝试执行 %f

    【讨论】:

    • double operand; 在我的模型的头文件中。它在做正常的 sin/cos 时工作正常,只是在我尝试转换为度数时不行。所有其他操作数-“操作”也可以正常工作。我怀疑这是一个代码问题,更多的是我的逻辑思维问题。
    • 尝试使用 CGFloat,它应该可以帮助解决 Steve 提到的舍入错误
    • 仍然使用 CGFloat 获得 122...e-16。我怎么知道该使用哪一个?什么时候加倍,什么时候浮动,什么时候CGFloat?有这方面的规则吗?谢谢。
    • 没有问题 :) 你会惊讶于我已经为那个挠头了多少次 ;)
    • itsjustpoison.com/blog/2008/12/01/nslog-format-specifiers 那应该告诉你,然后一些:)
    【解决方案4】:
    operand = sin(operand * (M_PI/180));
    

    【讨论】:

      【解决方案5】:

      你试过了吗

      sin( operand ) / 180.0 * M_PI
      

      【讨论】:

        猜你喜欢
        • 2014-01-02
        • 1970-01-01
        • 1970-01-01
        • 2012-04-17
        • 2015-11-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-04-09
        相关资源
        最近更新 更多