Skip to content

Commit

Permalink
update decimal128 mul_u128
Browse files Browse the repository at this point in the history
  • Loading branch information
sh-cha committed Sep 4, 2024
1 parent 6623a5c commit 9c54ba2
Showing 1 changed file with 15 additions and 8 deletions.
23 changes: 15 additions & 8 deletions precompile/modules/initia_stdlib/sources/decimal128.move
Original file line number Diff line number Diff line change
Expand Up @@ -105,24 +105,31 @@ module initia_std::decimal128 {
(val / (DECIMAL_FRACTIONAL as u256) as u64)
}

fun mul_u128_with_extra(decimal: &Decimal128, val: u128, extra: u128): u128 {
let a_quota = (decimal.val / DECIMAL_FRACTIONAL as u256);
let a_remainder = (decimal.val % DECIMAL_FRACTIONAL as u256);

let b_quota = (val / DECIMAL_FRACTIONAL as u256);
let b_remainder = (val % DECIMAL_FRACTIONAL as u256);

((a_quota * b_quota * (DECIMAL_FRACTIONAL as u256) +
a_quota * b_remainder + b_quota * a_remainder + (a_remainder * b_remainder + (extra as u256)) / (DECIMAL_FRACTIONAL as u256)) as u128)
}

public fun mul_u128(decimal: &Decimal128, val: u128): u128 {
((decimal.val as u256) * (val as u256) / (DECIMAL_FRACTIONAL as u256) as u128)
mul_u128_with_extra(decimal, val, 0)
}

public fun mul_u128_with_round_up(decimal: &Decimal128, val: u128): u128 {
let val = (decimal.val as u256) * (val as u256);
let val = val + (DECIMAL_FRACTIONAL as u256) / 2;
(val / (DECIMAL_FRACTIONAL as u256) as u128)
mul_u128_with_extra(decimal, val, DECIMAL_FRACTIONAL / 2)
}

public fun mul_u128_with_ceil(decimal: &Decimal128, val: u128): u128 {
let val = (decimal.val as u256) * (val as u256);
let val = val + (DECIMAL_FRACTIONAL as u256) - 1;
(val / (DECIMAL_FRACTIONAL as u256) as u128)
mul_u128_with_extra(decimal, val, DECIMAL_FRACTIONAL - 1)
}

public fun mul(a: &Decimal128, b: &Decimal128): Decimal128 {
new(((a.val as u256) * (b.val as u256) / (DECIMAL_FRACTIONAL as u256) as u128))
new(mul_u128(a, b.val))
}

public fun div_u64(decimal: &Decimal128, val: u64): Decimal128 {
Expand Down

0 comments on commit 9c54ba2

Please sign in to comment.