Sin, cos, tan, asin, acos atan atan2 polyfills for cross browser consistency.
Differences in trig function output between firefox and chrome, caused strainer/fancy simulations to run differently on the different browsers. Substituting the functions fixed this.
These replacements do not have the full accuracy which browser math functions have however they have about 10 decimal digits accuracy, provide consistency across browsers and even tend to run a little quicker.
//require or import trigfills.js
Trgf=require('./pathto/trigfills.js')
//sin, cos, tan, asin, acos and atan methods
//are all available on the object.
eg=Trgf.cos(rads)
//run setmaths() to override Math.cos ,Math.sin etc...
Trgf.setmaths()
//then Math trig functions are replaced with Trigfills:
Math.cos = Trgf.cos
Math.atan = Trgf.atan //etc...
Math.hasTrigfills = "version string"
www.mathonweb.com has well described and good algorithms for these math functions. I extended the minimum precision of these from about 6 digits to about 10, by extending a little the talyor series which were given, and then by mining tweaked factors (non-exhaustively).
drafts/test_node.log
contains nodes test output and test_moz.log
a firefox output.
Math.tan(0.123) // 0.1236240658 6927442
Trgf.tan(0.123) // 0.1236240658 8797101 135%
Math.sin(0.123) // 0.12269009002 431533
Trgf.sin(0.123) // 0.12269009002 68945 130%
Math.cos(0.123) // 0.99244503213 51935
Trgf.cos(0.123) // 0.99244503213 90508 135%
Math.atan(0.123) // 0.1223852814 7180266
Trgf.atan(0.123) // 0.1223852814 6213824 200%
Math.atan2(1,23) // 0.043450895391 53084
Trgf.atan2(1,23) // 0.043450895391 40537 250%
Math.asin(0.123) // 0.1233122751918 7199
Trgf.asin(0.123) // 0.1233122751818 901 130%
Math.acos(0.123) // 1.447484051 6030247
Trgf.acos(0.123) // 1.447484051 6130065 100%
-
Math.sin(Math.PI) returns
1.2246467991473532e-16
rather than 0 becauseMath.PI
is a smidgen less that the true value of PI. This is explained in this SO Topic Trigfill's sin and cos do not follow this specification as the value is far below their noise floor. Math.sin(0) does return 0. -
Math.tan(Math.PI/2) does not return Infinity because of the same idea. Trigfill's tan does comply with this, it does not return Infinity as this result could bug calculations not expecting it.
0.9.5 - Add atan2 0.9.4 - Minor speed tweaks 0.9.3 - Minor speed tweaks 0.9.2 - Working release candidate