npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

bigint-rational

v1.1.0

Published

rational arithmetic using built-in bigints

Downloads

9

Readme

bigint-rational

rational arithmetic using built-in bigints

Use this module to represent arbitrary-precision fractions using speedier built-in BigInt types with tighter control over performance and allocation.

If you want to support engines that don't have BigInt support, consider big-rat.

example

var rat = require('bigint-rational')
var out = [0n,1n]
rat.add(out, [4n,17n], [15n,6n])
rat.multiply(out, out, [8n,5n])
rat.subtract(out, out, [37n,52n])
console.log(out) // [97194n,26520n]
rat.reduce(out, out)
console.log(out) // [16199n,4420n]

api

You can load all the methods:

var rat = require('bigint-rational')

Or you can load individual files by their name. For example, to only load the reduce method:

var reduce = require('bigint-rational/reduce')

The conventions of this module are very similar to gl-vec3 or gl-mat4 where the container is an array or array-like type (in this case, a 2-tuple array).

If the result of the calculation is another rational, this result is written to the first argument (out) and is also the return value. This allows you to have more control over memory allocations, although the built-in bigint type has its own allocation profile and engine optimizations. It is always safe to use the same rational in the output and any of the arguments.

As you perform operations on rationals, the numerator and denominator will tend to grow. Methods such as add() are implemented without computing a common denominator and instead work according to a/b + c/d = (a*d + b*c) / (b*d). However, there are some special cases (such as the denominators being equal for addition and subtraction) to prevent the denominator from growing.

You can simplify the fractions using the reduce() method. After reducing, operations will tend to be faster but the reduce method itself has a performance cost as it must compute the greatest common divisor of both terms (a recursive algorithm). None of the arithmetic operations will automatically reduce the rational so that you have more fine-grained control over performance. Only reduce() uses a recursive algorithm.

rat.abs(out:rat, a:rat)

Take the absolute value of the rational a, storing the result in out.

Returns the stored result out.

rat.add(out:rat, a:rat, b:rat)

Add two rationals a and b, storing the result in out.

Returns the stored result out.

var clone = rat.clone(a:rat)

Return a new rational clone based on the contents of the rational a.

rat.compare(a:rat, b:rat)

Return whether a is greater than b (+1), less than b (-1), or equal to b (0).

Rationals do not need to be reduced to be considered equal. 9/12 and 6/8 are considered equal.

rat.copy(out:rat, a:rat)

Copy the contents of the rational a into out.

Returns the stored result out.

var r = rat.create(n:bigint, d:bigint)

Return a new rational r from a numerator n and a denominator d.

If n or d is not a bigint, it will be converted to a bigint using BigInt() this means you can use javascript numbers, decimal strings, or hex strings (prefaced by 0x) for the numerator and denominator.

rat.divide(out:rat, a:rat, b:rat)

Divide the rational a by the rational b, storing the result in out.

Returns the stored result out.

rat.eq(a:rat, b:rat)

Return a boolean whether the rationals a and b are equivalent.

Rationals do not need to be reduced to be considered equal.

rat.gt(a:rat, b:rat)

Return a boolean whether the rational a is greater than the rational b.

rat.gte(a:rat, b:rat)

Return a boolean whether the rational a is greater than or equal to the rational b.

rat.inverse(out:rat, a:rat)

Calculate the reciprocal of a, storing the result in out.

Returns the stored result out.

rat.lt(a:rat, b:rat)

Return a boolean whether the rational a is less than to the rational b.

rat.lte(a:rat, b:rat)

Return a boolean whether the rational a is less than or equal to the rational b.

rat.max(out:rat, a:rat, ...)

Calculate the largest rational from the provided values after the first argument, storing the result in out.

Returns the stored result out.

rat.min(out:rat, a:rat, ...)

Calculate the smallest rational from the provided values after the first argument, storing the result in out.

Returns the stored result out.

rat.multiply(out:rat, a:rat, b:rat)

Multiply the rational a by the rational b, storing the result in out.

Returns the stored result out.

rat.negate(out:rat, a:rat)

Negate the rational a, storing the result in out.

rat.pow(out:rat, a:rat, p:bigint)

Raise the rational a to the power p, storing the result in out.

rat.set(out:rat, n:bigint, d:bigint)

Store the numerator n and the denominator d in out.

If n or d is not a bigint, it will be converted to a bigint using BigInt() this means you can use javascript numbers, decimal strings, or hex strings (prefaced by 0x) for the numerator and denominator.

rat.sign(a:rat)

Return the sign of the rational a as a bigint: 1n, +1n, or 0n.

rat.reduce(out:rat, a:rat)

Simplify and normalize the rational a by factoring out a common divisor and moving the negative sign to the numerator if a has a negative sign.

Returns the stored result out.

rat.subtract(out:rat, a:rat, b:rat)

Subtract the rational a from the rational b, storing the result in out.

Returns the stored result out.

rat.toDecimal(a:rat, precision:bigint=10n, radix:bigint=10n)

Return a decimal approximation of the rational a as a string.

The result will have the integer part followed by a '.' followed by precision digits (default: 10 digits).

All the digits in the result are displaysed in base radix (default: 10).

license

BSD