Releases: forfudan/decimojo
DeciMojo v0.4.0
25/06/2025 (v0.4.0)
DeciMojo v0.4.0 updates the codebase to Mojo v25.4. This release enables you to use DeciMojo with the latest Mojo features.
What's Changed
Full Changelog: v0.3.1...v0.4.0
DeciMojo v0.3.1
06/06/2025 (v0.3.1)
DeciMojo v0.3.1 updates the codebase to Mojo 25.3 and replaces the magic
package manager with pixi
. This release enables you to use DeciMojo with the latest Mojo features and the new package manager.
What's Changed
- [mojo] Update the code to accommodate with Mojo 25.3 by @forfudan in #85
- [pixi] Change
magic
topixi
for environment and package management by @forfudan in #86
Full Changelog: v0.3.0...v0.3.1
DeciMojo v0.3.0
DeciMojo v0.3.0 for Mojo 25.2
DeciMojo v0.3.0 introduces the arbitrary-precision BigDecimal
type with comprehensive arithmetic operations, comparisons, and mathematical functions (sqrt
, root
, log
, exp
, power
). A new tomlmojo
package supports test refactoring. Improvements include refined BigUInt
constructors, enhanced scale_up_by_power_of_10()
functionality, and a critical multiplication bug fix.
⭐️ New
- Implement the
BigDecimal
type with unlimited precision arithmetic.- Implement basic arithmetic operations for
BigDecimal
: addition, subtraction, multiplication, division, and modulo. - Implement comparison operations for
BigDecimal
: less than, greater than, equal to, and not equal to. - Implement string representation and parsing for
BigDecimal
. - Implement mathematical operations for
BigDecimal
:sqrt
,nroot
,log
,exp
, andpower
functions. - Iimplement rounding functions.
- Implement basic arithmetic operations for
- Implement a simple TOML parser as package
tomlmojo
to refactor tests (PR #63).
🦋 Changed
- Refine the constructors of
BigUInt
(PR #64). - Improve the method
BigUInt.scale_up_by_power_of_10()
(PR #72).
🛠️ Fixed
- Fix a bug in
BigUInt
multiplication where the calcualtion of carry is mistakenly skipped if a word of x2 is zero (PR #70).
What's Changed
- [toml] Implement a TOML parser as package
tomlmojo
and use it to re-factor tests by @forfudan in #63 - [integer] Refine the constructors of
BigUInt
by @forfudan in #64 - [decimal] Implement some IO methods for
BigDecimal
by @forfudan in #65 - [decimal] Implement
add
forBigDecimal
by @forfudan in #66 - [decimal] Implement a subtraction function for
BigDecimal
by @forfudan in #67 - [decimal] Add tests for
subtract()
ofBigDecimal
by @forfudan in #68 - [decimal] Implement
multiply()
forBigDecimal
type by @forfudan in #69 - [decimal] Implement
true_divide
forBigDecimal
type + fix a bug inBigUInt.multiply
by @forfudan in #70 - [decimal][integer] Implement comparison operators for
BigDecimal
+ ImproveBigUInt.scale_up_by_power_of_10()
by @forfudan in #72 - [decimal] Implement
sqrt
forBigDecimal
by @forfudan in #73 - [decimal] Implement
exp()
forBigDecimal
by @forfudan in #74 - [decimal] Optimize
exp
forBigDecimal
by @forfudan in #75 - [decimal] Implement
ln
forBigDecimal
by @forfudan in #76 - [decimal] Implement
power
function forBigDecimal
by @forfudan in #77 - [docs] Update descriptions and examples by @forfudan in #78
- [docs] Update descriptions and examples by @forfudan in #79
- [decimal] Implement
root()
forBigDecimal
by @forfudan in #80 - [decimal][tests] Add tests for
root()
andpower()
ofBigDecimal
by @forfudan in #81 - [integer] Remove
multiply_toom_cook_3
forBigUInt
by @forfudan in #82 - [decimal] Implement
round()
forBigDecimal
by @forfudan in #83 - [docs] Update documents for release by @forfudan in #84
Full Changelog: v0.2.0...v0.3.0
DeciMojo v0.2.0
DeciMojo v0.2.0 for Mojo 25.2
Version 0.2.0 marks a significant expansion of DeciMojo with the introduction of BigInt
and BigUInt
types, providing unlimited precision integer arithmetic to complement the existing fixed-precision Decimal
type. Core arithmetic functions for the Decimal
type have been completely rewritten using Mojo 25.2's UInt128
, delivering substantial performance improvements. This release also extends mathematical capabilities with advanced operations including logarithms, exponentials, square roots, and n-th roots for the Decimal
type. The codebase has been reorganized into a more modular structure, enhancing maintainability and extensibility. With comprehensive test coverage, improved documentation in multiple languages, and optimized memory management, v0.2.0 represents a major advancement in both functionality and performance for numerical computing in Mojo.
DeciMojo division performance compared with Python's decimal
module across versions:
Division Operation | v0.1.0 vs Python | v0.2.0 vs Python | Improvement |
---|---|---|---|
Integer division (no remainder) | 0.15× (slower) | 485.88× faster | 3239× |
Simple decimal division | 0.13× (slower) | 185.77× faster | 1429× |
Division with repeating decimal | 0.04× (slower) | 12.46× faster | 311× |
Division by one | 0.15× (slower) | 738.60× faster | 4924× |
Division of zero | 1820.50× faster | 1866.50× faster | 1.03× |
Division with negative numbers | 0.11× (slower) | 159.32× faster | 1448× |
Division by very small number | 0.21× (slower) | 452.75× faster | 2156× |
High precision division | 0.005× (slower) | 15.19× faster | 3038× |
Division resulting in power of 10 | 0.21× (slower) | 619.00× faster | 2948× |
Division of very large numbers | 0.06× (slower) | 582.86× faster | 9714× |
Note: Benchmarks performed on Darwin 24.3.0, arm processor with Python 3.12.9. The dramatic performance improvements in v0.2.0 come from completely rewriting the division algorithm using Mojo 25.2's UInt128 implementation. While v0.1.0 was generally slower than Python for division operations (except for division of zero), v0.2.0 achieves speedups of 12-1866× depending on the specific scenario.
⭐️ New
- Add comprehensive
BigInt
andBigUInt
implementation with unlimited precision integer arithmetic. - Implement full arithmetic operations for
BigInt
andBigUInt
: addition, subtraction, multiplication, division, modulo and power operations. - Support both floor division (round toward negative infinity) and truncate division (round toward zero) semantics for mathematical correctness.
- Add complete comparison operations for
BigInt
with proper handling of negative values. - Implement efficient string representation and parsing for
BigInt
andBigUInt
. - Add advanced mathematical operations for
Decimal
: square root and n-th root. - Add logarithm functions for
Decimal
: natural logarithm, base-10 logarithm, and logarithm with arbitrary base. - Add exponential function and power function with arbitrary exponents for
Decimal
.
🦋 Changed
- Completely re-write the core arithmetic functions for
Decimal
type usingUInt128
introduced in Mojo 25.2. This significantly improves the performance ofDecimal
operations. - Improve memory management system to reduce allocations during calculations.
- Reorganize codebase with modular structure (decimal, arithmetics, comparison, exponential).
- Enhance
Decimal
comparison operators for better handling of edge cases. - Update internal representation of
Decimal
for better precision handling.
❌ Removed
- Remove deprecated legacy string formatting methods.
- Remove redundant conversion functions that were replaced with a more unified API.
🛠️ Fixed
- Fix edge cases in division operations with zero and one.
- Correct sign handling in mixed-sign operations for both
Decimal
. - Fix precision loss in repeated addition/subtraction operations.
- Correct rounding behavior in edge cases for financial calculations.
- Address inconsistencies between operator methods and named functions.
📚 Documentation and testing
- Add comprehensive test suite for
BigInt
andBigUInt
with over 200 test cases covering all operations and edge cases. - Create detailed API documentation for both
Decimal
andBigInt
. - Add performance comparison benchmarks between DeciMojo and Python's decimal/int implementation.
- Update multi-language documentation to include all new functionality (English and Chinese).
- Include clear explanations of division semantics and other potentially confusing numerical concepts.
What's Changed
- [decimal][bench] change return type of
coefficient()
to UInt128 + add benches by @forfudan in #15 - [decimal] Optimize
add()
function and remove string-based addition and subtraction by @forfudan in #16 - [repo] Move
decimojo
folder intosrc
folder by @forfudan in #17 - [decimal] Add
bit_cast()
and fixtruncate_to_max()
by @forfudan in #18 - [decimojo] Use
bitcast()
forcoefficient()
by @forfudan in #19 - [decimal] Optimize
multiply()
withUInt128
andUInt256
by @forfudan in #20 - [decimal] Optimize
divide()
and replace string-based approach with int-based approach by @forfudan in #21 - [decimal] Optimize
sqrt()
function by improving initial guess by @forfudan in #22 - [decimojo][fix] Enhance
round()
function and improve the performance + fixsqrt()
by @forfudan in #23 - [decimal] Re-write Decimal constructor from floating-point value
from_float()
by @forfudan in #24 - [decimal] Remove
str._float_to_decimal_str()
+ Add bench for from_string by @forfudan in #25 - [decimal] Re-write
from_string()
constructor and improve the performance by @forfudan in #26 - [decimal] Update comparison functions + code reorganization by @forfudan in #27
- [decimal] Add cache for powers of 10 by @forfudan in #28
- [decimal] simplifying initialization of
Decimal
and addfrom_uint128()
by @forfudan in #29 - [decimal] Implement
factorial()
andexp()
function by @forfudan in #30 - [decimal] Optimize
number_of_digit
+ improve the performance ofmultiply
andexp
by @forfudan in #31 - [test] Add more tests for
multiply()
by @forfudan in #32 - [decimal] Update Decimal constructors by @forfudan in #33
- [test] Add separate testing files for
__int__
,__float__
,__str__
by @forfudan in #34 - [docs] Change DeciMojo in URLs to lowercase by @forfudan in #35
- [decimal] Implement
ln()
function that gets natural logarithm by @forfudan in #36 - [decimal] Enhance
power()
function to accept a Decimal exponent by @forfudan in #37 - [decimal] Updates to the
Decimal
type by @forfudan in #38 - [fix] Fix bug in
multiply()
due to implicit type conversion by @forfudan in #39 - [decimal] Implement
root()
function to calculate the n-th root of a Decimal value by @forfudan in #40 - [decimal] Refine
Decimal
struct + improve docstrings by @forfudan in #41 - [decimal] Make
Decimal
type trivial + Addto_str_scientific()
method by @forfudan in #42 - [decimal] Implement the
log()
and thelog10()
functions by @forfudan in #43 - [decimal] Implement the
quantize()
function by @forfudan in #44 - [decimal] Implement
floor_divide
andmodulo
functions (// and %) by @forfudan in #45 - [repo][docs] Reorganize the repo + update the readme file by @forfudan in #46
- [docs] Update the readme file by @forfudan in #47
- [bigint] Implement
BigInt
type and basic arithmetic operations by @forfudan in #48 - [bigint] Add
to_int
and improvefrom_int
by @forfudan in #49 - [bigint] Optimize parsing of numeric strings by @forfudan in #50
- [bigint] Implement
multiply
forBigInt
by @forfudan in #51 - [decimal] Rename
floor_divide
totruncate_divide
to avoid ambiguity by @forfudan in #52 - [bigint] Implement
truncate_divide
andtruncate_modulo
forBigInt
by @forfudan in #53 - [integer] Implement
BigUInt
, basic methods and arithmetic functions by @forfudan in #54...
DeciMojo v0.1.0
DeciMojo v0.1.0 for Mojo 25.1
What's Changed
- [decimal] Add
__init__()
from int, float, and string + Implementadd
andneg
operators by @forfudan in #1 - [decimal] Implement
__sub__
method by @forfudan in #2 - [decimal] Implement
__mul__
by @forfudan in #3 - [decimal][examples] Add
__mul__
method + add examples + fix bugs by @forfudan in #4 - [decimal] Improve
__init__
method that reads a string by @forfudan in #5 - [decimal] Improve
__mul__
by @forfudan in #6 - [decimal] Implement
__truediv__
+ fix bug in__add__
by @forfudan in #7 - [decimal] Add
power
function + addis_int
method by @forfudan in #8 - [test] Add workflows by @forfudan in #9
- [decimal][routines] Implement
sqrt()
+ much debugging work by @forfudan in #11 - [decimal] Add
__abs__
and__float__
to implementAbsable
andFloatable
methods by @forfudan in #12 - [decimal][repo] Do some re-structuring of files + Add some methods by @forfudan in #13
- [doc][decimal] Update readme + add internal representation for inf and nan by @forfudan in #14
Full Changelog: https://github.com/forFudan/DeciMojo/commits/v0.1.0