Skip to content

Commit

Permalink
Added round.
Browse files Browse the repository at this point in the history
  • Loading branch information
leofisG authored and vgao1996 committed Aug 26, 2022
1 parent 6534505 commit 5fd04fa
Show file tree
Hide file tree
Showing 2 changed files with 50 additions and 15 deletions.
58 changes: 43 additions & 15 deletions language/move-stdlib/sources/fixed_point32.move
Original file line number Diff line number Diff line change
Expand Up @@ -215,26 +215,21 @@ module std::fixed_point32 {
FixedPoint32 {value: val << 32}
}

public fun as_u64(number: FixedPoint32): u64 {
number.value >> 32
}
spec as_u64 {
pragma opaque;
aborts_if false;
ensures result == spec_as_u64(number);
}
spec fun spec_as_u64(val: FixedPoint32): u64 {
val.value >> 32
}

public fun floor(num: FixedPoint32): u64 {
num.value >> 32
}
spec floor {
pragma opaque;
aborts_if false;
let one = 1 << 32;
ensures ((num.value - one) >> 32) <= result && result <= (num.value >> 32);
ensures result == spec_floor(num);
}
spec fun spec_floor(val: FixedPoint32): u64 {
let fractional = val.value % (1 << 32);
if (fractional == 0) {
val.value >> 32
} else {
(val.value - fractional) >> 32
}
}

public fun ceil(num: FixedPoint32): u64 {
Expand All @@ -248,8 +243,41 @@ module std::fixed_point32 {
spec ceil {
pragma opaque;
aborts_if false;
ensures result == spec_ceil(num);
}
spec fun spec_ceil(val: FixedPoint32): u64 {
let fractional = val.value % (1 << 32);
let one = 1 << 32;
if (fractional == 0) {
val.value >> 32
} else {
(val.value - fractional + one) >> 32
}
}

public fun round(num: FixedPoint32): u64 {
let floored_num = floor(num);
let bounary = (floored_num << 32) + ((1 << 32) / 2);
if (num.value < bounary) {
floored_num
} else {
ceil(num)
}
}
spec round {
pragma opaque;
aborts_if false;
ensures result == spec_round(num);
}
spec fun spec_round(val: FixedPoint32): u64 {
let fractional = val.value % (1 << 32);
let boundary = (1 << 32) / 2;
let one = 1 << 32;
ensures (num.value >> 32) <= result && result <= ((num.value + one) >> 32);
if (fractional < boundary) {
(val.value - fractional) >> 32
} else {
(val.value - fractional + one) >> 32
}
}

// **************** SPECIFICATIONS ****************
Expand Down
7 changes: 7 additions & 0 deletions language/move-stdlib/tests/fixedpoint32_tests.move
Original file line number Diff line number Diff line change
Expand Up @@ -145,4 +145,11 @@ module std::fixed_point32_tests {
let val = fixed_point32::ceil(point_five);
assert!(val == 1, 0);
}

#[test]
fun round_can_return_the_correct_number_one() {
let point_five = fixed_point32::create_from_rational(1, 2); // 0.5
let val = fixed_point32::round(point_five);
assert!(val == 1, 0);
}
}

0 comments on commit 5fd04fa

Please sign in to comment.