JavaScript-QuickJS
view release on metacpan or search on metacpan
quickjs/qjscalc.js view on Meta::CPAN
}
function fraction_sub(a, b) {
a = Fraction(a);
b = Fraction(b);
return Fraction.toFraction(a.num * b.den - a.den * b.num, a.den * b.den);
}
function fraction_mul(a, b) {
a = Fraction(a);
b = Fraction(b);
return Fraction.toFraction(a.num * b.num, a.den * b.den);
}
function fraction_div(a, b) {
a = Fraction(a);
b = Fraction(b);
return Fraction.toFraction(a.num * b.den, a.den * b.num);
}
function fraction_mod(a, b) {
var a1 = Fraction(a);
var b1 = Fraction(b);
return a - Integer.ediv(a1.num * b1.den, a1.den * b1.num) * b;
}
function fraction_eq(a, b) {
a = Fraction(a);
b = Fraction(b);
/* we assume the fractions are normalized */
return (a.num == b.num && a.den == b.den);
}
function fraction_lt(a, b) {
a = Fraction(a);
b = Fraction(b);
return (a.num * b.den < b.num * a.den);
}
/* operators are needed for fractions */
function float_add(a, b) {
return Float(a) + Float(b);
}
function float_sub(a, b) {
return Float(a) - Float(b);
}
function float_mul(a, b) {
return Float(a) * Float(b);
}
function float_div(a, b) {
return Float(a) / Float(b);
}
function float_mod(a, b) {
return Float(a) % Float(b);
}
function float_pow(a, b) {
return Float(a) ** Float(b);
}
function float_eq(a, b) {
/* XXX: may be better to use infinite precision for the comparison */
return Float(a) === Float(b);
}
function float_lt(a, b) {
a = Float(a);
b = Float(b);
/* XXX: may be better to use infinite precision for the comparison */
if (Float.isNaN(a) || Float.isNaN(b))
return undefined;
else
return a < b;
}
operators_set(Fraction.prototype,
{
"+": fraction_add,
"-": fraction_sub,
"*": fraction_mul,
"/": fraction_div,
"%": fraction_mod,
"**": generic_pow,
"==": fraction_eq,
"<": fraction_lt,
"pos"(a) {
return a;
},
"neg"(a) {
return Fraction(-a.num, a.den);
},
},
{
left: [Number, BigInt],
right: [Number, BigInt],
"+": fraction_add,
"-": fraction_sub,
"*": fraction_mul,
"/": fraction_div,
"%": fraction_mod,
"**": generic_pow,
"==": fraction_eq,
"<": fraction_lt,
},
{
left: Float,
right: Float,
"+": float_add,
"-": float_sub,
"*": float_mul,
"/": float_div,
"%": float_mod,
"**": float_pow,
"==": float_eq,
"<": float_lt,
});
add_props(Fraction, {
/* (internal use) simplify 'a' to an integer when possible */
toFraction(a, b) {
var r = Fraction(a, b);
if (algebraicMode && r.den == 1)
return r.num;
else
return r;
},
});
add_props(Fraction.prototype, {
[Symbol.toPrimitive](hint) {
( run in 0.834 second using v1.01-cache-2.11-cpan-adec679a428 )