[Cobra](http://cobra-language.com/)
=

<!-- language: lang-cobra -->

    class Trig
    	const mod as float = 0.0174532925199433f #0.017453292519943295769236907684886127134 = tau/360
    	var time as System.Diagnostics.Stopwatch = System.Diagnostics.Stopwatch()
    	var output as List<of String> = List<of String>()
    	def main
    		for line in File.readLines('trig.in'), .output.add(.compute(float.parse(line)) + '\n')
    		File.writeAllLines('trig.out', .output)
    		print .time.elapsed
    	def compute(degrees as float) as String
    		#for angles > 360, insert `degrees %= 360` here
    		.time.start
    		if degrees % 180 <> 90
    			rad as float = degrees * .mod
    			two as float = rad * rad
    			cos as float = 1
    			cos -= (rad *= rad) / 2
    			cos += (rad *= two) / 24
    			cos -= (rad *= two) / 720
    			cos += (rad *= two) / 40320
    			cos -= (rad *= two) / 3628800
    			cos += (rad *= two) / 479001600
    			cos -= (rad *= two) / 87178291200
    			cos += (rad *= two) / 20922789888000
    			cos -= (rad *= two) / 6402373705728000
    			cos += (rad *= two) / 2432902008176640000
    			cos -= (rad *= two) / 1124000727777607680000f
    			cos += (rad *= two) / 620448401733239439360000f
    			cos -= (rad *= two) / 403291461126605635584000000f
    			cos += (rad *= two) / 304888344611713860501504000000f
    		else, cos as float = 0
    		if degrees % 180, sin as float = Math.sqrt(1 - (cos * cos)) * (((degrees - 180) * -1) / Math.abs(degrees - 180))
    		else, sin as float = 0
    		tan as float = sin / cos
    		.time.stop
    		return sin.toString('0.000000E+0') + ' ' + cos.toString('0.000000E+0') + ' ' + tan.toString('0.000000E+0')

Compile it with `cobra filename -turbo`. Although if you can install Xamarin Studio and use [this](https://github.com/ramon-rocha/MonoDevelop.CobraBinding) plugin, it'll provide times that are 2%-5% faster than even the `-turbo` flag. I'm not sure why.

The output is now 100% accurate to the specified number of sigfigs,  
and is almost as fast as the inbuilt functions (but more accurate).

**Tests:** AMD FX6300 @5.1GHz

 - The 360 * 10000 test used by the C answer runs in 610ms (vs 190ms)

 - The 4-entry test used by the Python answer runs in 4.6µs (vs 30µs)

 - The 1000 random angle test used by the Fortran answer runs at 180ns per angle (vs 10µs)