Skip to main content

Just another (cool) no-deps math library

Project description

Metrima Logo

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

PyPI version Python License: MIT

Version 0.3.x UnfinishedAlert: The WeightUnit is unfinished and is currently inaccurate.

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.5.3.tar.gz (42.6 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.5.3-py3-none-any.whl (44.3 kB view details)

Uploaded Python 3

File details

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

File metadata

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

File hashes

Hashes for metrima-0.3.5.3.tar.gz
Algorithm Hash digest
SHA256 a7d5f60f954440010d8de85f382ef1a3ee3732a2d6e73acfc884f4468c55c303
MD5 91a79177b4e3da8f948eac2c3fe00fdf
BLAKE2b-256 5019cc43f4a27891127a011a99090baae7598cfc2e567506ba808f1ce608a409

See more details on using hashes here.

File details

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

File metadata

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

File hashes

Hashes for metrima-0.3.5.3-py3-none-any.whl
Algorithm Hash digest
SHA256 9f910a966dcf97aa2fdee5b09f02f8a2abeb4d7fd4ab1c9641428e4c79b0ae05
MD5 bc8cc4184fa94daf405d705b2a70d1cb
BLAKE2b-256 2e03a74c722f283a199ad7db1d5594b67ec640d0d9c7d9db1fc93ed6ca2dd52b

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