为三角计算制作Swift假设学位

Pro*_*OXO 4 trigonometry ios swift

是否可以在Swift for iOS中更改设置,属性等,以便它假设三角计算的度数而不是弧度?

例如,sin(90)将评估为1.

我有:

let pi = 3.14 
var r2d = 180.0/pi
var d2r = pi/180
Run Code Online (Sandbox Code Playgroud)

......但是转换正在为一些长三角方程真正参与.

Mar*_*n R 30

正如在其他答案中已经说过的那样,标准库中没有采用度数参数的三角函数.

如果你定义自己的功能,那么你可以使用__sinpi(), __cospi()的,等等,而不是由π乘以:

// Swift 2:
func sin(degrees degrees: Double) -> Double {
    return __sinpi(degrees/180.0)
}

// Swift 3:
func sin(degrees: Double) -> Double {
    return __sinpi(degrees/180.0)
}
Run Code Online (Sandbox Code Playgroud)

__sinpi手册页(重点添加):

__sinpi()函数返回pi乘以x的正弦值(以弧度为单位).这可以比sin(M_PI*x)更精确地计算,因为它可以隐含地使用尽可能多的pi位来提供全面的结果,而不是M_PI受限的53位.对于大x,它也可能更有效,因为所涉及的参数减少非常简单.

__sinpi() 相关功能是非标准功能,但可在iOS 7/OS X 10.9及更高版本上使用.

例:

sin(degrees: 180.0)       // 0
Run Code Online (Sandbox Code Playgroud)

给出了一个精确的结果,与之形成对比:

sin(180.0 * M_PI/180.0) // 1.224646799147353e-16
Run Code Online (Sandbox Code Playgroud)

只是为了好玩:这是你可以为所有浮点类型定义基于度的正弦函数,包括CGFloat函数重载(现在为Swift 3更新):

func sin(degrees: Double) -> Double {
    return __sinpi(degrees/180.0)
}

func sin(degrees: Float) -> Float {
    return __sinpif(degrees/180.0)
}

func sin(degrees: CGFloat) -> CGFloat {
    return CGFloat(sin(degrees: degrees.native))
}
Run Code Online (Sandbox Code Playgroud)

在最后一个变体中,编译器自动从degrees.native要调用的函数的实际类型推断,以便在32位和64位平台上都能正常工作.

  • **这是一个令人难以置信的提示**非常感谢你 (3认同)
  • 嘿@MartinR`__sinpi`必须是整个网站上最好的“专业提示”之一。我送出了赏金,以表示感谢。制造商 (2认同)
  • 这是一个很棒的和很好的描述答案 (2认同)

Ale*_*ylo 7

添加扩展名以明确识别这种类型的值将是处理此类事情的适当方法:

import Darwin // needed to get M_PI
extension Double {
  public var degrees: Double { return self * M_PI / 180 }
  public var ?: Double { return self * 180 / M_PI }
}
Run Code Online (Sandbox Code Playgroud)

把它放进游乐场,看看你如何得到你期望的结果:

sin(90.degrees)  --> 1.0
1.?  -->  57.2957795130823
1.?.degrees --> 1.0
(M_PI / 3).?  -->  60.0
Run Code Online (Sandbox Code Playgroud)


rob*_*off 2

没有任何设置或属性可以更改内置三角函数。如果您想简化表达式或定义自己的sindegcosdeg等,则应该严格使用弧度。

\n\n

每个浮点类型都有一个static名为 的内置成员pi,其值是 \xcf\x80 的最佳近似值。例如:Double.piFloat.piCGFloat.pi

\n\n

另外,sin 90\xcb\x9a 是 1,而不是 0。

\n