Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Make Swift Assume Degrees for Trigonometry Calculations

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.

like image 856
ProGirlXOXO Avatar asked Feb 19 '15 03:02

ProGirlXOXO


People also ask

Do you use RAD or DEG for Trig?

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.

What mode should calculator be in for Trig?

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."


1 Answers

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.

like image 190
Martin R Avatar answered Sep 28 '22 05:09

Martin R