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 🙏

© 2026 – Pkg Stats / Ryan Hefner

@art-suite/art-core-math

v0.1.4

Published

The Standard Library for JavaScript that aught to be.

Readme

@art-suite/art-core-math

A high-performance utility library for mathematical operations with a focus on precision management and practical use cases.

Features

  • Consistent handling of floating-point precision issues
  • Specialized comparisons for both absolute and relative values
  • Random number generation utilities with seeding capabilities
  • TypeScript definitions for complete type safety

Installation

npm install @art-suite/art-core-math

API Overview

Basic Math Operations

Core mathematical functions that provide consistent behavior across platforms:

// Absolute value
abs(value: number): number

// Rounding operations
floor(value: number): number
ceil(value: number): number
round(value: number, decimalPlaces?: number): number

// Integer and fractional parts
iPart(value: number): number   // Integer part
fPart(value: number): number   // Fractional part

// Min/Max operations
min(...values: number[]): number
max(...values: number[]): number
minMagnitude(...values: number[]): number  // Returns value with smallest absolute value
maxMagnitude(...values: number[]): number  // Returns value with largest absolute value

// Modulo that works correctly with negative numbers
modulo(dividend: number, divisor: number): number  // Unlike % operator, always returns positive result

Floating-Point Precision Handling

Functions that deal with floating-point precision issues, which can cause unexpected comparison results:

// Constants for precision thresholds
float32Precision: number  // Precision for 32-bit floats
float64Precision: number  // Precision for 64-bit floats

// Float32 comparison (for 32-bit floating point operations)
float32Eq(a: number, b: number): boolean    // Equal within float32 precision
float32Eq0(value: number): boolean          // Equal to zero within float32 precision
float32Gt(a: number, b: number): boolean    // Greater than, accounting for precision
float32Gte(a: number, b: number): boolean   // Greater than or equal, accounting for precision
float32Lt(a: number, b: number): boolean    // Less than, accounting for precision
float32Lte(a: number, b: number): boolean   // Less than or equal, accounting for precision
float32True0(value: number): number         // Returns 0 if within float32 precision of 0

// Float64 comparison (for standard JavaScript numbers)
floatEq(a: number, b: number): boolean      // Equal within float64 precision
floatEq0(value: number): boolean            // Equal to zero within float64 precision
floatGt(a: number, b: number): boolean      // Greater than, accounting for precision
floatGte(a: number, b: number): boolean     // Greater than or equal, accounting for precision
floatLt(a: number, b: number): boolean      // Less than, accounting for precision
floatLte(a: number, b: number): boolean     // Less than or equal, accounting for precision
floatTrue0(value: number): number           // Returns 0 if within float64 precision of 0

Absolute Value Comparisons

Convenience functions for comparing the absolute values directly:

absGt(a: number, b: number): boolean     // |a| > b
absGte(a: number, b: number): boolean    // |a| >= b
absLt(a: number, b: number): boolean     // |a| < b
absLte(a: number, b: number): boolean    // |a| <= b

Value Constraints and Transformations

Functions for constraining or transforming numeric values:

// Constrain a value between min and max
bound(value: number, min: number, max: number): number

// Limit the amount a value can change
maxChange(value: number, targetValue: number, maxChange: number): number

// Very large number handling
nearInfinity(): number            // Returns a very large number just below infinity
nearInfinityResult: number        // Pre-computed result of nearInfinity()

Random Number Generation

Utilities for generating random values:

// Basic random generation
random(): number                                    // Random number between 0 and 1
boolRand(): boolean                                // Random boolean (true or false)
intRand(min: number, max: number): number          // Random integer between min and max inclusive

// Seeded random generation for reproducible sequences
seededRandomNumberGenerator(seed: number): () => number  // Creates a random generator with a specific seed

Number Formatting and Conversion

Functions for formatting numbers as strings and converting between formats:

// String formatting
commaize(value: number): string                // Adds commas as thousands separators
numberToTightString(value: number): string     // Compact string representation without unnecessary digits
simplifyNum(value: number): number             // Removes trailing zeros and decimal point if possible

// Conversion
stringToNumberArray(str: string): number[]     // Converts a string of numbers to an array of numbers

Special Utilities

Other mathematical utilities for specific use cases:

// Sequence generator
cyclingSequenceFunction(sequence: any[]): () => any  // Creates a function that cycles through a sequence

Examples

Dealing with Floating-Point Precision

import { floatEq, floatTrue0 } from "@art-suite/art-core-math";

// Floating-point precision issues
0.1 + 0.2 === 0.3; // false! (equals 0.30000000000000004)
floatEq(0.1 + 0.2, 0.3); // true

// Clean up small floating-point errors
floatTrue0(1e-16); // 0

Bounded Values for Animation

import { bound, maxChange } from "@art-suite/art-core-math";

// Ensure value stays within range
bound(velocity, -maxSpeed, maxSpeed); // Clamping a velocity

// Smooth transitions
let currentPosition = 0;
const targetPosition = 100;

// Each frame, move toward target with limited change rate
function animationFrame() {
  currentPosition = maxChange(currentPosition, targetPosition, 5);
  // This ensures we move at most 5 units per frame
}

Consistent Modulo

import { modulo } from "@art-suite/art-core-math";

// JavaScript % operator doesn't behave as expected with negative numbers
-5 % 12; // -5
modulo(-5, 12); // 7 (always gives positive result, better for cyclic values)

Random Number Generation

import {
  random,
  intRand,
  seededRandomNumberGenerator,
} from "@art-suite/art-core-math";

// Random value between 0 and 1
const probability = random();

// Random integer (inclusive range)
const diceRoll = intRand(1, 6);

// Reproducible random sequence
const seededRandom = seededRandomNumberGenerator(12345);
const value1 = seededRandom(); // Same value every time with seed 12345
const value2 = seededRandom(); // Same second value every time

Number Formatting

import { commaize, numberToTightString } from "@art-suite/art-core-math";

// Add thousands separators
commaize(1234567); // "1,234,567"

// Compact representation
numberToTightString(123.0); // "123"
numberToTightString(123.45); // "123.45"

License

MIT