Is it possible to change a setting, property, etc in Swift for iOS so that it assumes degrees for trigonometry calculations rather than radians?
For example sin(90)
would be evaluated to 1
.
I have:
let pi = 3.14
var r2d = 180.0/pi
var d2r = pi/180
... but the conversions are getting really involved for some of the long trig equations.
Any angle plugged into a trig function must be in radians but, because degrees are so common outside of a math class, calculators are designed to handle degrees inside trig functions.
For graphing calculators, press "Mode." If you are using degrees (generally, if you are in geometry), the calculator should be set to degrees or "deg." If you are using radians (precalculus or trigonometry), it should be set to radians or "rad."
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With