Skip to content

Releases: forfudan/decimojo

DeciMojo v0.4.0

26 Jun 19:54
8ed3dab
Compare
Choose a tag to compare

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 Jun 14:57
fd82601
Compare
Choose a tag to compare

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 to pixi for environment and package management by @forfudan in #86

Full Changelog: v0.3.0...v0.3.1

DeciMojo v0.3.0

15 Apr 09:56
f2930f0
Compare
Choose a tag to compare

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, and power functions.
    • Iimplement rounding functions.
  • 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 for BigDecimal by @forfudan in #66
  • [decimal] Implement a subtraction function for BigDecimal by @forfudan in #67
  • [decimal] Add tests for subtract() of BigDecimal by @forfudan in #68
  • [decimal] Implement multiply() for BigDecimal type by @forfudan in #69
  • [decimal] Implement true_divide for BigDecimal type + fix a bug in BigUInt.multiply by @forfudan in #70
  • [decimal][integer] Implement comparison operators for BigDecimal + Improve BigUInt.scale_up_by_power_of_10() by @forfudan in #72
  • [decimal] Implement sqrt for BigDecimal by @forfudan in #73
  • [decimal] Implement exp() for BigDecimal by @forfudan in #74
  • [decimal] Optimize exp for BigDecimal by @forfudan in #75
  • [decimal] Implement ln for BigDecimal by @forfudan in #76
  • [decimal] Implement power function for BigDecimal 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() for BigDecimal by @forfudan in #80
  • [decimal][tests] Add tests for root() and power() of BigDecimal by @forfudan in #81
  • [integer] Remove multiply_toom_cook_3 for BigUInt by @forfudan in #82
  • [decimal] Implement round() for BigDecimal 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

27 Mar 17:24
fba2fa8
Compare
Choose a tag to compare

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 and BigUInt implementation with unlimited precision integer arithmetic.
  • Implement full arithmetic operations for BigInt and BigUInt: 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 and BigUInt.
  • 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 using UInt128 introduced in Mojo 25.2. This significantly improves the performance of Decimal 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 and BigUInt with over 200 test cases covering all operations and edge cases.
  • Create detailed API documentation for both Decimal and BigInt.
  • 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 into src folder by @forfudan in #17
  • [decimal] Add bit_cast() and fix truncate_to_max() by @forfudan in #18
  • [decimojo] Use bitcast() for coefficient() by @forfudan in #19
  • [decimal] Optimize multiply() with UInt128 and UInt256 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 + fix sqrt() 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 add from_uint128() by @forfudan in #29
  • [decimal] Implement factorial() and exp() function by @forfudan in #30
  • [decimal] Optimize number_of_digit + improve the performance of multiply and exp 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 + Add to_str_scientific() method by @forfudan in #42
  • [decimal] Implement the log() and the log10() functions by @forfudan in #43
  • [decimal] Implement the quantize() function by @forfudan in #44
  • [decimal] Implement floor_divide and modulo 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 improve from_int by @forfudan in #49
  • [bigint] Optimize parsing of numeric strings by @forfudan in #50
  • [bigint] Implement multiply for BigInt by @forfudan in #51
  • [decimal] Rename floor_divide to truncate_divide to avoid ambiguity by @forfudan in #52
  • [bigint] Implement truncate_divide and truncate_modulo for BigInt by @forfudan in #53
  • [integer] Implement BigUInt, basic methods and arithmetic functions by @forfudan in #54...
Read more

DeciMojo v0.1.0

07 Mar 20:59
47f0a51
Compare
Choose a tag to compare

DeciMojo v0.1.0 for Mojo 25.1

What's Changed

  • [decimal] Add __init__() from int, float, and string + Implement add and neg 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 + add is_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 implement Absable and Floatable 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