Releases: forfudan/decimojo
DeciMojo v0.6.0
20251216 (v0.6.0)
DeciMojo v0.6.0 updates the codebase to Mojo v0.25.7, adopting the new TestSuite type for improved test organization. All tests have been refactored to use the native Mojo testing framework instead of the deprecated pixi test command.
What's Changed
- [mojo] Update the codebase to accommodate Mojo v0.25.6 by @forfudan in #120
- [mojo] Update the codebase to Mojo v0.25.7 by @forfudan in #121
- [release][docs] Update documents for version 0.6.0 by @forfudan in #122
Full Changelog: v0.5.0...v0.6.0
DeciMojo v0.5.0
20250806 (v0.5.0)
DeciMojo v0.5.0 introduces significant enhancements to the BigDecimal and BigUInt types, including new mathematical functions and performance optimizations. The release adds trigonometric functions for BigDecimal, implements the Chudnovsky algorithm for computing π, and implements the Karatsuba multiplication algorithm and Burnikel-Ziegler division algorithm for BigUInt. In-place operations, slice operations, and SIMD operations are now supported for BigUInt arithmetic. The Decimal type is renamed to Decimal128 to reflect its 128-bit fixed precision. The release also includes improved error handling, optimized type conversions, refactored testing suites, and documentation updates.
DeciMojo v0.5.0 is compatible with Mojo v25.5.
⭐️ New
- Introduce trigonometric functions for
BigDecimal:sin(),cos(),tan(),cot(),csc(),sec(). These functions compute the corresponding trigonometric values of a given angle in radians with arbitrary precision (#96, #99). - Introduce the function
pi()forBigDecimalto compute the value of π (pi) with arbitrary precision with the Chudnovsky algorithm with binary splitting (#95). - Implement the
sqrt()function forBigUIntto compute the square root of aBigUIntnumber as aBigUIntobject (#107). - Introduce a
DeciMojoErrortype and various aliases to handle errors in DeciMojo. This enables a more consistent error handling mechanism across the library and allows users to track errors more easily (#114).
🦋 Changed
Changes in BigUInt:
- Refine the
BigUIntmultiplication with the Karatsuba algorithm. The time complexity of maltiplication is reduced from$O(n^2)$ to$O(n^{ln(3/2)})$ for large integers, which significantly improves performance for big numbers. Doubling the size of the numbers will only increase the time taken by a factor of about 3, instead of 4 as in the previous implementation (#97). - Refine the
BigUIntdivision with the Burnikel-Ziegler fast recursive division algorithm. The time complexity of division is also reduced from$O(n^2)$ to$O(n^{ln(3/2)})$ for large integers (#103). - Refine the fall-back schoolbook division of
BigUIntto improve performance. The fallback division is used when the divisor is small enough (#98, #100). - Implement auxiliary functions for arithmetic operations of
BigUIntto handle special cases more efficiently, e.g., when the second operand is one-word long or is aUInt32value (#98, #104, #111). - Implement in-place subtraction for
BigUInt. The__isub__method ofBigUIntwill now conduct in-place subtraction.x -= ywill not lead to memory allocation, but will modify the originalBigUIntobjectxdirectly (#98). - Use SIMD for
BigUIntaddition and subtraction operations. This allows the addition and subtraction of twoBigUIntobjects to be performed in parallel, significantly improving performance for large numbers (#101, #102). - Implement functions for all arithmetic operations on slices of
BigUIntobjects. This allows you to perform arithmetic operations on slices ofBigUIntobjects without having to convert them toBigUIntfirst, leading to less memory allocation and improved performance (#105). - Add
to_uint64()andto_uint128()methods toBigUIntto for fast type conversion (#91).
Changes in BigDecimal:
- Re-implemente the
sqrt()function forBigDecimalto use the newBigUInt.sqrt()method for better performance and accuracy. The new implementation adjusts the scale and coefficient directly, which is more efficient than the previous method. Introduce a newsqrt_decimal_approach()function to preserve the old implementation for reference (#108). - Refine or re-implement the basic arithmetic operations, e.g.,, addition, subtraction, multiplication, division, etc, for
BigDecimaland simplify the logic. The new implementation is more efficient and easier to understand, leading to better performance (#109, #110). - Add a default precision 36 for
BigDecimalmethods (#112).
Other changes:
- Update the codebase to Mojo v25.5 (#113).
- Remove unnecessary
raiseskeywords for all functions (#92). - Rename the
Decimaltype toDecimal128to reflect its fixed precision of 128 bits. It has a new aliasDec128(#112). Decimalis now an alias forBigDecimal(#112).
🛠️ Fixed
- Fix a bug for
BigUIntcomparison: When there are leading zero words, the comparison returns incorrect results (#97). - Fix the
is_zero(),is_one(), andis_two()methods forBigUIntto correctly handle the case when there are leading zero words (#97).
📚 Documentation and testing
What's Changed
- [integer] Improve the
BigUInttype with several changes by @forfudan in #91 - [integer][decimal] Improve error messages and remove unnecessary
raisesby @forfudan in #92 - [tests] Refactor the test files for
BigDecimalby @forfudan in #93 - [decimal] Implement
arctan()andpi()forBigDecimalby @forfudan in #94 - [decimal] Use Chudnovsky with binary splitting to calculate pi by @forfudan in #95
- [decimal] Implement
sin()andcos()forBigDecimalby @forfudan in #96 - [integer] Improve
BigUIntmultiplication by implementing Karatsuba algorithm by @forfudan in #97 - [integer] Refine arithmetic functions of
BigUIntby @forfudan in #98 - [decimal] Implement
tan(),cot(),csc(),sec()forBigDecimalby @forfudan in #99 - [integer] Refine normalization of
BigUIntdivision so that correction is no longer needed by @forfudan in #100 - [integer] Optimize
BigUIntaddition and subtraction with SIMD and early stop tricks by @forfudan in #101 - [integer] Improve
BigUIntsubtraction with SIMD by @forfudan in #102 - [integer] Implement Burnikel-Ziegler fast recursive division algorithm for
BigUIntby @forfudan in #103 - [integer] Update
multiply_inplace_by_uint32()forBigUIntwhen the y is no greater than 4 by @forfudan in #104 - [integer] Use slices operations on
BigUIntfast division algorithm by @forfudan in #105 - [tests] Refactor the testing files for
BigIntandBigUIntby @forfudan in #106 - [integer] Implement
sqrt()forBigUIntby @forfudan in #107 - [decimal] Re-implement
BigDecimal.sqrt()with help ofBigUInt.sqrt()by @forfudan in #108 - [decimal] Refine methods of
BigDecimaltype by @forfudan in #109 - [decimal] Re-implement the
true_divide()function forBigDecimalby @forfudan in #110 - [integer] Update
BigUIntdivision by simplifying logic and adding auxiliary functions by @forfudan in #111 - [decimal] Rename
DecimalasDecimal128+ Add default precision toBigDecimalas 36 by @forfudan in #112 - [mojo] Update the codebase to Mojo v25.5 nightly by @forfudan in #113
- [errors] Improve error handling by using
DeciMojoErrortype by @forfudan in #114 - [integer] Implement
floor_divide_by_power_of_billion()by @forfudan in #115 - [integer] Ensure that
BigUInthas no leading zero words by @forfudan in #116 - [docs] Update the changelog for version 0.5.0 by @forfudan in #117
- [release][docs] Update documents for the release of version 0.5.0 by @forfudan in #118
Full Changelog: v0.4.1...v0.5.0
DeciMojo v0.4.1
01/07/2025 (v0.4.1)
Version 0.4.1 of DeciMojo introduces implicit type conversion between built-in integral types and arbitrary-precision types.
⭐️ New
Now DeciMojo supports implicit type conversion between built-in integeral types (Int, UInt, Int8, UInt8, Int16, UInt16, Int32, UInt32, Int64, UInt64, Int128,UInt128, Int256, and UInt256) and the arbitrary-precision types (BigUInt, BigInt, and BigDecimal). This allows you to use these built-in types directly in arithmetic operations with BigInt and BigUInt without explicit conversion. The merged type will always be the most compatible one (PR #89, PR #90).
For example, you can now do the following:
from decimojo.prelude import *
fn main() raises:
var a = BInt(Int256(-1234567890))
var b = BigUInt(31415926)
var c = BDec("3.14159265358979323")
print("a =", a)
print("b =", b)
print("c =", c)
print(a * b) # Merged to BInt
print(a + c) # Merged to BDec
print(b + c) # Merged to BDec
print(a * Int(-128)) # Merged to BInt
print(b * UInt(8)) # Merged to BUInt
print(c * Int256(987654321123456789)) # Merged to BDec
var lst = [a, b, c, UInt8(255), Int64(22222), UInt256(1234567890)]
# The list is of the type `List[BigDecimal]`
for i in lst:
print(i, end=", ")Running the code will give your the following results:
a = -1234567890
b = 31415926
c = 3.14159265358979323
-38785093474216140
-1234567886.85840734641020677
31415929.14159265358979323
158024689920
251327408
3102807559527666386.46423202534973847
-1234567890, 31415926, 3.14159265358979323, 255, 22222, 1234567890,🦋 Changed
Optimize the case when you increase the value of a BigInt object in-place by 1, i.e., i += 1. This allows you to iterate faster (PR #89). For example, we can compute the time taken to iterate from 0 to 1_000_000 using BigInt and compare it with the built-in Int type:
from decimojo.prelude import *
fn main() raises:
i = BigInt(0)
end = BigInt(1_000_000)
while i < end:
print(i)
i += 1| scenario | Time taken |
|---|---|
v0.4.0 BigInt |
1.102s |
v0.4.1 BigInt |
0.912s |
Built-in Int |
0.893s |
🛠️ Fixed
Fix a bug in BigDecimal where it cannot create a correct value from a integral scalar, e.g., BDec(UInt16(0)) returns an unitialized BigDecimal object (PR #89).
📚 Documentation and testing
Update the tests module and refactor the test files for BigUInt (PR #88).
What's Changed
- [integer][tests] Add operation overload between
BigIntandInt+ refactor some tests by @forfudan in #88 - [integer][decimal] Allows implicit type conversion and type merging by @forfudan in #89
- [integer][decimal][docs] Improve type conversions + optimize
iaddforBigInt+ Update documentation by @forfudan in #90
Full Changelog: v0.4.0...v0.4.1
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
magictopixifor 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
BigDecimaltype 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, andpowerfunctions. - Iimplement rounding functions.
- Implement basic arithmetic operations for
- Implement a simple TOML parser as package
tomlmojoto 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
BigUIntmultiplication 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
tomlmojoand use it to re-factor tests by @forfudan in #63 - [integer] Refine the constructors of
BigUIntby @forfudan in #64 - [decimal] Implement some IO methods for
BigDecimalby @forfudan in #65 - [decimal] Implement
addforBigDecimalby @forfudan in #66 - [decimal] Implement a subtraction function for
BigDecimalby @forfudan in #67 - [decimal] Add tests for
subtract()ofBigDecimalby @forfudan in #68 - [decimal] Implement
multiply()forBigDecimaltype by @forfudan in #69 - [decimal] Implement
true_divideforBigDecimaltype + fix a bug inBigUInt.multiplyby @forfudan in #70 - [decimal][integer] Implement comparison operators for
BigDecimal+ ImproveBigUInt.scale_up_by_power_of_10()by @forfudan in #72 - [decimal] Implement
sqrtforBigDecimalby @forfudan in #73 - [decimal] Implement
exp()forBigDecimalby @forfudan in #74 - [decimal] Optimize
expforBigDecimalby @forfudan in #75 - [decimal] Implement
lnforBigDecimalby @forfudan in #76 - [decimal] Implement
powerfunction forBigDecimalby @forfudan in #77 - [docs] Update descriptions and examples by @forfudan in #78
- [docs] Update descriptions and examples by @forfudan in #79
- [decimal] Implement
root()forBigDecimalby @forfudan in #80 - [decimal][tests] Add tests for
root()andpower()ofBigDecimalby @forfudan in #81 - [integer] Remove
multiply_toom_cook_3forBigUIntby @forfudan in #82 - [decimal] Implement
round()forBigDecimalby @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
BigIntandBigUIntimplementation with unlimited precision integer arithmetic. - Implement full arithmetic operations for
BigIntandBigUInt: 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
BigIntwith proper handling of negative values. - Implement efficient string representation and parsing for
BigIntandBigUInt. - 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
Decimaltype usingUInt128introduced in Mojo 25.2. This significantly improves the performance ofDecimaloperations. - Improve memory management system to reduce allocations during calculations.
- Reorganize codebase with modular structure (decimal, arithmetics, comparison, exponential).
- Enhance
Decimalcomparison operators for better handling of edge cases. - Update internal representation of
Decimalfor 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
BigIntandBigUIntwith over 200 test cases covering all operations and edge cases. - Create detailed API documentation for both
DecimalandBigInt. - 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
decimojofolder intosrcfolder 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()withUInt128andUInt256by @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
Decimaland addfrom_uint128()by @forfudan in #29 - [decimal] Implement
factorial()andexp()function by @forfudan in #30 - [decimal] Optimize
number_of_digit+ improve the performance ofmultiplyandexpby @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
Decimaltype 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
Decimalstruct + improve docstrings by @forfudan in #41 - [decimal] Make
Decimaltype 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_divideandmodulofunctions (// 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
BigInttype and basic arithmetic operations by @forfudan in #48 - [bigint] Add
to_intand improvefrom_intby @forfudan in #49 - [bigint] Optimize parsing of numeric strings by @forfudan in #50
- [bigint] Implement
multiplyforBigIntby @forfudan in #51 - [decimal] Rename
floor_dividetotruncate_divideto avoid ambiguity by @forfudan in #52 - [bigint] Implement
truncate_divideandtruncate_moduloforBigIntby @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 + Implementaddandnegoperators 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
powerfunction + addis_intmethod 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 implementAbsableandFloatablemethods 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