fraction.js
Advanced tools
Comparing version 1.2.0 to 1.2.1
{ | ||
"name": "fraction.js", | ||
"main": "fraction.js", | ||
"version": "1.2.0", | ||
"version": "1.2.1", | ||
"homepage": "http://www.xarg.org/2014/03/precise-calculations-in-javascript/", | ||
@@ -13,2 +13,6 @@ "description": "A rational number library", | ||
], | ||
"license": [ | ||
"MIT", | ||
"GPL" | ||
], | ||
"repository": { | ||
@@ -21,2 +25,2 @@ "type": "git", | ||
] | ||
} | ||
} |
/** | ||
* @license Fraction.js v1.2.0 12/03/2014 | ||
* @license Fraction.js v1.2.1 20/04/2014 | ||
* http://www.xarg.org/2014/03/precise-calculations-in-javascript/ | ||
@@ -47,3 +47,3 @@ * | ||
}; | ||
var self = this; | ||
@@ -137,4 +137,4 @@ | ||
}; | ||
/** | ||
@@ -204,3 +204,3 @@ * Calculates the modulo of two rational numbers - a more precise fmod | ||
num = parse(arguments); | ||
if (0 === (num['n'] * self['d'])) { | ||
@@ -222,3 +222,3 @@ return false; | ||
}; | ||
/** | ||
@@ -312,3 +312,3 @@ * Returns a string-fraction representation of a Fraction object | ||
case "object": | ||
if (param === null) { | ||
@@ -340,49 +340,53 @@ break; | ||
var A = 0, B = 1; | ||
var C = 1, D = 1; | ||
if (param > 0) { // check for != 0, scale would become NaN (log(0)), which converges really slow | ||
var N = 10000000; | ||
var A = 0, B = 1; | ||
var C = 1, D = 1; | ||
var scale = Math.pow(10, Math.floor(1 + Math.log(param) / Math.LN10)); | ||
var N = 10000000; | ||
param/= scale; | ||
var scale = Math.pow(10, Math.floor(1 + Math.log(param) / Math.LN10)); | ||
// Using Farey Sequences | ||
// http://www.johndcook.com/blog/2010/10/20/best-rational-approximation/ | ||
param/= scale; | ||
while (B <= N && D <= N) { | ||
var M = (A + C) / (B + D); | ||
if (param === M) { | ||
if (B + D <= N) { | ||
n = A + C; | ||
d = B + D; | ||
} else if (D > B) { | ||
n = C; | ||
d = D; | ||
// Using Farey Sequences | ||
// http://www.johndcook.com/blog/2010/10/20/best-rational-approximation/ | ||
while (B <= N && D <= N) { | ||
var M = (A + C) / (B + D); | ||
if (param === M) { | ||
if (B + D <= N) { | ||
n = A + C; | ||
d = B + D; | ||
} else if (D > B) { | ||
n = C; | ||
d = D; | ||
} else { | ||
n = A; | ||
d = B; | ||
} | ||
break; | ||
} else { | ||
n = A; | ||
d = B; | ||
if (param > M) { | ||
A+= C; | ||
B+= D; | ||
} else { | ||
C+= A; | ||
D+= B; | ||
} | ||
if (B > N) { | ||
n = C; | ||
d = D; | ||
} else { | ||
n = A; | ||
d = B; | ||
} | ||
} | ||
break; | ||
} else if (param > M) { | ||
A+= C; | ||
B+= D; | ||
} else { | ||
C+= A; | ||
D+= B; | ||
} | ||
n*= scale; | ||
} | ||
if (!(B <= N && D <= N)) { | ||
if (B > N) { | ||
n = C; | ||
d = D; | ||
} else { | ||
n = A; | ||
d = B; | ||
} | ||
} | ||
n*= scale; | ||
break; | ||
@@ -389,0 +393,0 @@ |
/* | ||
Fraction.js v1.2.0 12/03/2014 | ||
Fraction.js v1.2.1 20/04/2014 | ||
http://www.xarg.org/2014/03/precise-calculations-in-javascript/ | ||
@@ -8,7 +8,7 @@ | ||
*/ | ||
function Fraction(m){function q(b,a){if(0===a%2)return q(b,a/2);if(0===a%5)return q(b,a/5);for(var c=1;c<=a;c++)if(1===r(c,a))return c;return 0}function r(b,a){for(var c=10,e=1;0<b;c=c*c%a,b>>=1)b&1&&(e=e*c%a);return e}function h(b,n){if(!n)throw"DIV/0";a.s=(0<=b)-(0>b);b=Math.abs(b);n=Math.abs(n);for(var c=b,e=n,g;e;)g=e,e=c%e,c=g;a.n=b/c;a.d=n/c;return a}function k(b){var a=0,c=1,e=1;if(1===b.length)b=b[0];else if(2!==b.length)throw"Parameter mismatch";switch(typeof b){case "object":if(null===b)break; | ||
else if(void 0!==b[0]&&void 0!==b[1]){a=b[0];c=b[1];e=a*c;break}else if("d"in b&&"n"in b){a=b.n;c=b.d;e=a*c;void 0!==b.s&&(e*=b.s);break}else throw"Unknown format";case "number":0>b&&(b=-b,e=-1);var g=0,d=1,f=1,l=1,k=Math.pow(10,Math.floor(1+Math.log(b)/Math.LN10));for(b/=k;1E7>=d&&1E7>=l;){var m=(g+f)/(d+l);if(b===m){1E7>=d+l?(a=g+f,c=d+l):l>d?(a=f,c=l):(a=g,c=d);break}else b>m?(g+=f,d+=l):(f+=g,l+=d)}1E7>=d&&1E7>=l||(1E7<d?(a=f,c=l):(a=g,c=d));a*=k;break;case "string":a=b.split("");b=[0,0,0,0,0]; | ||
c=[0,0,0,0,0];for(f=d=0;f<a.length;f++)if("."===a[f])if(0===d)d++;else throw"Corrupted number";else if("("===a[f]||"'"===a[f]||")"===a[f])if(0<d&&3>d)d++;else throw"Corrupted number";else if(0===f&&"-"===a[0])e=-1;else if(3>d){g=parseInt(a[f],10);if(isNaN(g))throw"Corrupted number";b[d]=10*b[d]+g;c[d]++}else throw"Corrupted number";if(2===d)throw"Corrupted number";b[3]=Math.pow(10,c[1]);b[4]=0<b[2]?Math.pow(10,c[2])-1:1;a=b[2]+b[4]*(b[0]*b[3]+b[1]);c=b[3]*b[4];break;default:throw"Unknown type";}c|| | ||
h(0,0);p.n=Math.abs(a);p.d=Math.abs(c);p.s=(0<=e)-(0>e);return p}var p={n:0,d:0,s:0},a=this;a.abs=function(){a.s=1;return a};a.add=function(b){b=k(arguments);return h(a.s*a.n*b.d+b.s*a.d*b.n,a.d*b.d)};a.sub=function(b){b=k(arguments);return h(a.s*a.n*b.d-b.s*a.d*b.n,a.d*b.d)};a.mul=function(b){b=k(arguments);return h(a.s*b.s*a.n*b.n,a.d*b.d)};a.div=function(b){b=k(arguments);return h(a.s*b.s*a.n*b.d,a.d*b.n)};a.set=function(a){a=k(arguments);return h(a.s*a.n,a.d)};a.mod=function(b){b=k(arguments); | ||
return 0===b.n*a.d?h(0,0):h(a.s*b.d*a.n%(b.n*a.d),b.d*a.d)};a.reciprocal=function(){return h(a.s*a.d,a.n)};a.equals=function(b){b=k(arguments);return b.s*b.n*a.d===a.s*a.n*b.d};a.divisible=function(b){b=k(arguments);return 0===b.n*a.d?!1:0===a.n*b.d%(b.n*a.d)};a.toDouble=function(){return a.s*a.n/a.d};a.toFraction=function(){return a.n>a.d?0===a.n%a.d?""+a.s*a.n/a.d:(a.s*a.n/a.d|0)+" "+a.n%a.d+"/"+a.d:a.s*a.n+" / "+a.d};a.toString=function(){var b=(""+a.n).split(""),k=a.d,c=0,e="",g=q(a.n,a.d),d; | ||
a:{d=a.d;for(var f=0;f<d;f++)if(r(f,d)===r(f+g,d)){d=f;break a}d=0}for(var f=-1,l=10+g+d+b.length,h=0;h<l;h++){c*=10;h<b.length?c+=parseInt(b[h],10):h===b.length?(e+=".",f=0):f++;if(0<g&&f===d)e+="(";else if(0<g&&f-d===g){e+=")";break}c>=k?(e+=c/k|0,c%=k):e+="0"}return(~a.s?"":"-")+e.replace(/^0+([1-9]|0\.)/g,"$1").replace(/(\d)0+$/,"$1")};a.n=0;a.d=a.s=1;m=k(arguments);h(m.s*m.n,m.d)}"undefined"!==typeof module&&module.exports&&(module.exports.Fraction=Fraction); | ||
function Fraction(n){function q(b,a){if(0===a%2)return q(b,a/2);if(0===a%5)return q(b,a/5);for(var c=1;c<=a;c++)if(1===r(c,a))return c;return 0}function r(b,a){for(var c=10,d=1;0<b;c=c*c%a,b>>=1)b&1&&(d=d*c%a);return d}function k(b,m){if(!m)throw"DIV/0";a.s=(0<=b)-(0>b);b=Math.abs(b);m=Math.abs(m);for(var c=b,d=m,h;d;)h=d,d=c%d,c=h;a.n=b/c;a.d=m/c;return a}function l(b){var a=0,c=1,d=1;if(1===b.length)b=b[0];else if(2!==b.length)throw"Parameter mismatch";switch(typeof b){case "object":if(null===b)break; | ||
else if(void 0!==b[0]&&void 0!==b[1]){a=b[0];c=b[1];d=a*c;break}else if("d"in b&&"n"in b){a=b.n;c=b.d;d=a*c;void 0!==b.s&&(d*=b.s);break}else throw"Unknown format";case "number":0>b&&(b=-b,d=-1);if(0<b){var h=0,f=1,e=1,g=1,l=Math.pow(10,Math.floor(1+Math.log(b)/Math.LN10));for(b/=l;1E7>=f&&1E7>=g;)if(a=(h+e)/(f+g),b===a){1E7>=f+g?(a=h+e,c=f+g):g>f?(a=e,c=g):(a=h,c=f);break}else b>a?(h+=e,f+=g):(e+=h,g+=f),1E7<f?(a=e,c=g):(a=h,c=f);a*=l}break;case "string":a=b.split("");b=[0,0,0,0,0];h=[0,0,0,0,0]; | ||
for(g=e=0;g<a.length;g++)if("."===a[g])if(0===e)e++;else throw"Corrupted number";else if("("===a[g]||"'"===a[g]||")"===a[g])if(0<e&&3>e)e++;else throw"Corrupted number";else if(0===g&&"-"===a[0])d=-1;else if(3>e){f=parseInt(a[g],10);if(isNaN(f))throw"Corrupted number";b[e]=10*b[e]+f;h[e]++}else throw"Corrupted number";if(2===e)throw"Corrupted number";b[3]=Math.pow(10,h[1]);b[4]=0<b[2]?Math.pow(10,h[2])-1:1;a=b[2]+b[4]*(b[0]*b[3]+b[1]);c=b[3]*b[4];break;default:throw"Unknown type";}c||k(0,0);p.n=Math.abs(a); | ||
p.d=Math.abs(c);p.s=(0<=d)-(0>d);return p}var p={n:0,d:0,s:0},a=this;a.abs=function(){a.s=1;return a};a.add=function(b){b=l(arguments);return k(a.s*a.n*b.d+b.s*a.d*b.n,a.d*b.d)};a.sub=function(b){b=l(arguments);return k(a.s*a.n*b.d-b.s*a.d*b.n,a.d*b.d)};a.mul=function(b){b=l(arguments);return k(a.s*b.s*a.n*b.n,a.d*b.d)};a.div=function(b){b=l(arguments);return k(a.s*b.s*a.n*b.d,a.d*b.n)};a.set=function(a){a=l(arguments);return k(a.s*a.n,a.d)};a.mod=function(b){b=l(arguments);return 0===b.n*a.d?k(0, | ||
0):k(a.s*b.d*a.n%(b.n*a.d),b.d*a.d)};a.reciprocal=function(){return k(a.s*a.d,a.n)};a.equals=function(b){b=l(arguments);return b.s*b.n*a.d===a.s*a.n*b.d};a.divisible=function(b){b=l(arguments);return 0===b.n*a.d?!1:0===a.n*b.d%(b.n*a.d)};a.toDouble=function(){return a.s*a.n/a.d};a.toFraction=function(){return a.n>a.d?0===a.n%a.d?""+a.s*a.n/a.d:(a.s*a.n/a.d|0)+" "+a.n%a.d+"/"+a.d:a.s*a.n+" / "+a.d};a.toString=function(){var b=(""+a.n).split(""),l=a.d,c=0,d="",h=q(a.n,a.d),f;a:{f=a.d;for(var e=0;e< | ||
f;e++)if(r(e,f)===r(e+h,f)){f=e;break a}f=0}for(var e=-1,g=10+h+f+b.length,k=0;k<g;k++){c*=10;k<b.length?c+=parseInt(b[k],10):k===b.length?(d+=".",e=0):e++;if(0<h&&e===f)d+="(";else if(0<h&&e-f===h){d+=")";break}c>=l?(d+=c/l|0,c%=l):d+="0"}return(~a.s?"":"-")+d.replace(/^0+([1-9]|0\.)/g,"$1").replace(/(\d)0+$/,"$1")};a.n=0;a.d=a.s=1;n=l(arguments);k(n.s*n.n,n.d)}"undefined"!==typeof module&&module.exports&&(module.exports.Fraction=Fraction); |
{ | ||
"name": "fraction.js", | ||
"title": "fraction.js", | ||
"version": "1.2.0", | ||
"version": "1.2.1", | ||
"homepage": "http://www.xarg.org/2014/03/precise-calculations-in-javascript/", | ||
@@ -6,0 +6,0 @@ "description": "A rational number library", |
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
33896
784