As already said in the other answers, there are no trigonometric functions in the standard library that take the arguments in degrees.
If you define your own function then you can use __sinpi()
,
__cospi()
, etc ... instead of multiplying by π:
// 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)
}
From the __sinpi
manual page (emphasis added):
The
__sinpi()
function returns the sine of pi times x (measured in
radians). This can be computed more accurately than sin(M_PI * x), because it can implicitly use as many bits of pi as are necessary to
deliver a well-rounded result, instead of the 53-bits to which M_PI is limited. For large x it may
also be more efficient, as the argument reduction involved is significantly simpler.
__sinpi()
and the related functions are non-standard, but
available on iOS 7/OS X 10.9 and later.
Example:
sin(degrees: 180.0) // 0
gives an exact result, in contrast to:
sin(180.0 * M_PI/180.0) // 1.224646799147353e-16
And just for fun: This is how you can define the degree-based sine function for all floating point types, including CGFloat
with
function overloading (now updated for 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))
}
In the last variant, the compiler automatically infers from the
actual type of degrees.native
which function to call, so that this
works correctly on both 32-bit and 64-bit platforms.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…