Spaces:
Sleeping
Sleeping
| // Adds floating point numbers with twice the normal precision. | |
| // Reference: J. R. Shewchuk, Adaptive Precision Floating-Point Arithmetic and | |
| // Fast Robust Geometric Predicates, Discrete & Computational Geometry 18(3) | |
| // 305–363 (1997). | |
| // Code adapted from GeographicLib by Charles F. F. Karney, | |
| // http://geographiclib.sourceforge.net/ | |
| // See lib/geographiclib/LICENSE for details. | |
| function d3_adder() {} | |
| d3_adder.prototype = { | |
| s: 0, // rounded value | |
| t: 0, // exact error | |
| add: function(y) { | |
| d3_adderSum(y, this.t, d3_adderTemp); | |
| d3_adderSum(d3_adderTemp.s, this.s, this); | |
| if (this.s) this.t += d3_adderTemp.t; | |
| else this.s = d3_adderTemp.t; | |
| }, | |
| reset: function() { | |
| this.s = this.t = 0; | |
| }, | |
| valueOf: function() { | |
| return this.s; | |
| } | |
| }; | |
| var d3_adderTemp = new d3_adder; | |
| function d3_adderSum(a, b, o) { | |
| var x = o.s = a + b, // a + b | |
| bv = x - a, av = x - bv; // b_virtual & a_virtual | |
| o.t = (a - av) + (b - bv); // a_roundoff + b_roundoff | |
| } | |