Skip to main content

Just another (cool) no-deps math library

Project description

Metrima

A small, comprehensive math library with fixed-point arithmetic precision and useful utilities.

PyPI version Python License: MIT

Overview

Metrima is a Python math library that provides precise decimal arithmetic through the Fx (Fixed-point) class, eliminating floating-point precision issues. Beyond arithmetic, it includes time unit handling, functional utilities, decorators, and mathematical constants.

Features

Fixed-Point Arithmetic (Fx)

  • Precise Decimal Operations: Avoid floating-point precision errors
  • Full Operator Support: All standard math operations (+, -, *, /, //, %, **)
  • Immutable Design: Thread-safe and predictable behavior
  • Type Conversions: Seamless conversion between Fx, int, float, and str
  • Comparison Operations: Complete set of comparison operators
  • Unary Operations: Negation, absolute value, and rounding

Time Units

  • Time Arithmetic: Hour, Minute, Second, Millisecond classes
  • Automatic Conversions: Seamless operations between different time units
  • Precision Handling: Maintains millisecond precision with automatic overflow

Utility Functions (lib)

  • String manipulation: trim, chop, locate
  • Collection operations: length, invert, combinelst, push_back, attach
  • Type checking: is_whole, is_whitespace, exists
  • Iteration utilities: span, indexed
  • Deep copying: duplicate
  • Validation: has, verify

Decorators

  • @timed: Measure execution time
  • @memo: Memoization with configurable cache
  • @repeat: Execute functions multiple times
  • @legacy: Mark deprecated functions
  • @mimic: Copy function metadata
  • @attribute: Custom property-like descriptor

Mathematical Constants

  • Common constants: PI, E, GOLDEN_RATIO
  • Physical constants: GRAVITY, SPEED_OF_LIGHT, PLANCK_CONSTANT
  • Chemical constants: BOLTZMANN_CONSTANT, AVOGADRO_NUMBER, GAS_CONSTANT
  • Special values: INFINITE, NAN

Installation

pip install metrima

Quick Start

Fixed-Point Arithmetic

from metrima import Fx, fx

# Create fixed-point numbers
a = Fx("1.432")
b = fx(5.1234)  # Convenience function

# Perform arithmetic
result = a + b
print(result)  # 6.5554

# Mix with regular numbers
c = Fx(10.0) - 2.45
print(c)  # 7.55

# Complex expressions
d = (Fx(2.5) + Fx(3.5)) * Fx(4) - Fx(10) / Fx(2)
print(d)  # 19.0

Time Units

from metrima import Hour, Minute, Second, hour, minute, second

# Create time values
duration = Hour(2) + Minute(30)
print(duration)  # 2h 30m (displayed as seconds internally)

# Arithmetic with different units
result = hour(1) - minute(15)
print(second(result))  # 2700 seconds

# Comparisons
print(Minute(60) > Hour(1))  # False

Decorators

from metrima import timed, memo, repeat

@timed
def slow_computation(n):
    return sum(range(n))

result, duration = slow_computation(1000000)
print(f"Computed in {duration:.3f}s")

@memo
def fibonacci(n):
    if n <= 1:
        return n
    return fibonacci(n - 1) + fibonacci(n - 2)

@repeat(increment_counter)(count=5)
def task():
    print("Running task...")

Utility Functions

from metrima import span, chop, trim, duplicate

# Iteration
for i in span(5):
    print(i)  # 0, 1, 2, 3, 4

# String operations
words = chop("hello,world,python", ",")
print(words)  # ['hello', 'world', 'python']

clean = trim("   hello world   ")
print(clean)  # "hello world"

# Deep copy
original = [1, [2, 3]]
copy = duplicate(original)

Why Metrima?

Standard Python floating-point arithmetic can produce unexpected results:

# Python's float arithmetic
0.1 + 0.2  # 0.30000000000000004 😱

# Metrima's Fx arithmetic
Fx(0.1) + Fx(0.2)  # 0.3 ✨

Testing

Metrima includes comprehensive test suites covering all functionality.

Run Interactive Tests

metrimatest

This launches an interactive menu with options:

  1. Competition Demo - Compare Metrima vs Python vs Decimal
  2. Fx Class Testing - Unit tests for fixed-point arithmetic
  3. Decorators Testing - Test all decorator functionality
  4. Library Functions Testing - Test utility functions
  5. TimeUnits Testing - Test time arithmetic

Test from Code

from metrima import test_main, test_fx, test_decorators, test_lib, test_timeunits

test_main()       # Run competition tests
test_fx()         # Test Fx class
test_decorators() # Test decorators
test_lib()        # Test library functions
test_timeunits()  # Test time units

API Reference

Core Functions

from metrima import add, subtract, mul, div, sigma

add(a, b)       # Addition
subtract(a, b)  # Subtraction
mul(a, b)       # Multiplication
div(a, b)       # Division
sigma(lst)      # Sum of list elements

Fx Class Methods

Arithmetic: __add__, __sub__, __mul__, __truediv__, __floordiv__, __mod__, __pow__

Unary: __neg__, __pos__, __abs__, __round__

Comparisons: __eq__, __ne__, __lt__, __le__, __gt__, __ge__

Conversions: __int__, __float__, __str__, __repr__, __bool__

Utility: is_zero(), is_positive(), is_negative(), is_integer(), copy()

Time Unit Classes

Classes: Hour, Minute, Second, Millisecond

Converters: hour(), minute(), second(), ms()

All time units support arithmetic operations, comparisons, and automatic conversions.

Requirements

  • Python >= 3.14
  • tinycolors >= 0.5.1.3 (for colorized output)

Version

Current version: 0.3.0

License

MIT License - see LICENSE file for details.

Contributing

Contributions are welcome! Please feel free to submit a Pull Request.

Repository

GitHub: https://github.com/tyydev1/metrima

Authors

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

metrima-0.3.0.tar.gz (28.4 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

metrima-0.3.0-py3-none-any.whl (27.9 kB view details)

Uploaded Python 3

File details

Details for the file metrima-0.3.0.tar.gz.

File metadata

  • Download URL: metrima-0.3.0.tar.gz
  • Upload date:
  • Size: 28.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.14.0

File hashes

Hashes for metrima-0.3.0.tar.gz
Algorithm Hash digest
SHA256 79235b10250072807472884b183729e8572e0ec6615463aa07fcfe856fe87994
MD5 116289fd9bde9bb72ddfa9cee7ba2cd3
BLAKE2b-256 ca891485bd60b59a1ab7c6cae2d3b8ee981e92f7941331ffeb11d877f6f5124f

See more details on using hashes here.

File details

Details for the file metrima-0.3.0-py3-none-any.whl.

File metadata

  • Download URL: metrima-0.3.0-py3-none-any.whl
  • Upload date:
  • Size: 27.9 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.14.0

File hashes

Hashes for metrima-0.3.0-py3-none-any.whl
Algorithm Hash digest
SHA256 57ebf246875df6299bc28e1dd3771328c646e30e4264ee393fc74a156bb9997e
MD5 8ba24deed300911a22def3169178c584
BLAKE2b-256 c625bb695241361568cb8890fcb34d3c9a24b1a7dee3ebb7f09aa2d2e02af82f

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page