py-tools/src/tools/math.py

41 lines
861 B
Python

from __future__ import annotations
import math
from decimal import Decimal, ROUND_HALF_UP
from typing import Iterable
MAXINT32 = 2**32
MAXINT64 = 2**64
MAXINT32_SIGNED = 2**31
MAXINT64_SIGNED = 2**63
MAXINT32_UNSIGNED = MAXINT32
MAXINT64_UNSIGNED = MAXINT64
def round_half_up(number: int | float) -> int:
"""pythons round() rounds .5 to the *even* number; 0.5 == 0"""
return int(Decimal(number).to_integral(ROUND_HALF_UP))
def get_factors(num: int) -> set:
f = {num}
for x in range(1, int(math.sqrt(num)) + 1):
if num % x == 0:
f.add(x)
f.add(num // x)
return f
def mul(ints: Iterable[int]) -> int:
"""similar to sum(), just for multiplication"""
ret = 1
for x in ints:
ret *= x
return ret
def magnitude(value: int | float) -> int:
return math.floor(math.log10(value))