mirror of
https://github.com/vlang/v.git
synced 2025-09-13 22:42:26 +03:00

Some checks are pending
Graphics CI / gg-regressions (push) Waiting to run
vlib modules CI / build-module-docs (push) Waiting to run
Shy and PV CI / v-compiles-puzzle-vibes (push) Waiting to run
Sanitized CI / sanitize-undefined-clang (push) Waiting to run
Sanitized CI / sanitize-undefined-gcc (push) Waiting to run
Sanitized CI / tests-sanitize-address-clang (push) Waiting to run
Sanitized CI / sanitize-address-msvc (push) Waiting to run
Sanitized CI / sanitize-address-gcc (push) Waiting to run
Sanitized CI / sanitize-memory-clang (push) Waiting to run
sdl CI / v-compiles-sdl-examples (push) Waiting to run
Time CI / time-linux (push) Waiting to run
Time CI / time-macos (push) Waiting to run
Time CI / time-windows (push) Waiting to run
toml CI / toml-module-pass-external-test-suites (push) Waiting to run
Tools CI / tools-linux (clang) (push) Waiting to run
Tools CI / tools-linux (gcc) (push) Waiting to run
Tools CI / tools-linux (tcc) (push) Waiting to run
Tools CI / tools-macos (clang) (push) Waiting to run
Tools CI / tools-windows (gcc) (push) Waiting to run
Tools CI / tools-windows (msvc) (push) Waiting to run
Tools CI / tools-windows (tcc) (push) Waiting to run
Tools CI / tools-docker-ubuntu-musl (push) Waiting to run
vab CI / v-compiles-os-android (push) Waiting to run
vab CI / vab-compiles-v-examples (push) Waiting to run
152 lines
3.9 KiB
V
152 lines
3.9 KiB
V
module big
|
|
|
|
import rand
|
|
|
|
fn test_left_shift_in_place() {
|
|
mut a := [u64(1), 1, 1, 1, 1]
|
|
left_shift_in_place(mut a, 1)
|
|
assert a == [u64(2), 2, 2, 2, 2]
|
|
left_shift_in_place(mut a, 7)
|
|
assert a == [u64(256), 256, 256, 256, 256]
|
|
mut b := [u64(0x08000000_00000001), 0x0c000000_00000000, 0x08000000_00000000, 0x07ffffff_ffffffff]
|
|
left_shift_in_place(mut b, 1)
|
|
assert b == [u64(2), 0x08000000_00000001, 1, 0x0fffffff_ffffffff]
|
|
mut c := [u64(0x00ffffff_ffffffff), 0x00f0f0f0_f0f0f0f0, 1, 0x03ffffff_ffffffff, 1]
|
|
left_shift_in_place(mut c, 2)
|
|
assert c == [u64(0x03ffffff_fffffffc), 0x03c3c3c3_c3c3c3c0, 4, 0x0fffffff_fffffffc, 4]
|
|
}
|
|
|
|
fn test_right_shift_in_place() {
|
|
mut a := [u64(2), 2, 2, 2, 2]
|
|
right_shift_in_place(mut a, 1)
|
|
assert a == [u64(1), 1, 1, 1, 1]
|
|
a = [u64(256), 256, 256, 256, 256]
|
|
right_shift_in_place(mut a, 7)
|
|
assert a == [u64(2), 2, 2, 2, 2]
|
|
a = [u64(0), 0, 1]
|
|
right_shift_in_place(mut a, 1)
|
|
assert a == [u64(0), 0x08000000_00000000, 0]
|
|
mut b := [u64(3), 0x08000000_00000001, 1, 0x0fffffff_ffffffff]
|
|
right_shift_in_place(mut b, 1)
|
|
assert b == [u64(0x08000000_00000001), 0x0c000000_00000000, 0x08000000_00000000,
|
|
0x07ffffff_ffffffff]
|
|
mut c := [u64(0x03ffffff), 0x03c3c3c3_c3c3c3c0, 7, 0xfffffffc, 4]
|
|
right_shift_in_place(mut c, 2)
|
|
assert c == [u64(0x00ffffff), 0x0cf0f0f0_f0f0f0f0, 1, 0x3fffffff, 1]
|
|
}
|
|
|
|
fn test_subtract_align_last_byte_in_place() {
|
|
mut a := [u64(2), 2, 2, 2, 2]
|
|
mut b := [u64(1), 1, 2, 1, 1]
|
|
subtract_align_last_byte_in_place(mut a, b)
|
|
assert a == [u64(1), 1, 0, 1, 1]
|
|
|
|
a = [u64(0), 0, 0, 0, 1]
|
|
b = [u64(0), 0, 1]
|
|
subtract_align_last_byte_in_place(mut a, b)
|
|
assert a == [u64(0), 0, 0, 0, 0]
|
|
|
|
a = [u64(0), 0, 0, 0, 1, 13]
|
|
b = [u64(1), 0, 1]
|
|
mut c := []u64{len: a.len}
|
|
mut d := [u64(0), 0, 0]
|
|
d << b // to have same length
|
|
subtract_digit_array(a, d, mut c)
|
|
subtract_align_last_byte_in_place(mut a, b)
|
|
assert a == [u64(0), 0, 0, u64(-1) & max_digit, 0, 12]
|
|
assert c == a
|
|
}
|
|
|
|
fn test_greater_equal_from_end() {
|
|
mut a := [u64(1), 2, 3, 4, 5, 6]
|
|
mut b := [u64(3), 4, 5, 6]
|
|
assert greater_equal_from_end(a, b) == true
|
|
|
|
a = [u64(1), 2, 3, 4, 5, 6]
|
|
b = [u64(1), 2, 3, 4, 5, 6]
|
|
assert greater_equal_from_end(a, b) == true
|
|
|
|
a = [u64(1), 2, 3, 4, 5, 6]
|
|
b = [u64(2), 2, 3, 4, 5, 6]
|
|
assert greater_equal_from_end(a, b) == false
|
|
|
|
a = [u64(0), 0, 0, 4, 5, 6]
|
|
b = [u64(4), 5, 6]
|
|
assert greater_equal_from_end(a, b) == true
|
|
|
|
a = [u64(0), 0, 0, 4, 5, 6]
|
|
b = [u64(4), 6, 6]
|
|
assert greater_equal_from_end(a, b) == false
|
|
|
|
a = [u64(0), 0, 0, 4, 5, 5]
|
|
b = [u64(4), 5, 6]
|
|
assert greater_equal_from_end(a, b) == false
|
|
}
|
|
|
|
fn test_divide_digit_array_03() {
|
|
a := [u64(0), 4]
|
|
b := [u64(0), 1]
|
|
mut q := []u64{cap: a.len - b.len + 1}
|
|
mut r := []u64{cap: a.len}
|
|
|
|
divide_digit_array(a, b, mut q, mut r)
|
|
assert q == [u64(4)]
|
|
assert r == []u64{len: 0}
|
|
}
|
|
|
|
fn test_divide_digit_array_04() {
|
|
a := [u64(2), 4]
|
|
b := [u64(0), 1]
|
|
mut q := []u64{cap: a.len - b.len + 1}
|
|
mut r := []u64{cap: a.len}
|
|
|
|
divide_digit_array(a, b, mut q, mut r)
|
|
assert q == [u64(4)]
|
|
assert r == [u64(2)]
|
|
}
|
|
|
|
fn test_divide_digit_array_05() {
|
|
a := [u64(2), 4, 5]
|
|
b := [u64(0), 1]
|
|
mut q := []u64{cap: a.len - b.len + 1}
|
|
mut r := []u64{cap: a.len}
|
|
|
|
divide_digit_array(a, b, mut q, mut r)
|
|
assert q == [u64(4), 5]
|
|
assert r == [u64(2)]
|
|
}
|
|
|
|
fn test_divide_digit_array_06() {
|
|
a := [u64(2), 4, 5, 3]
|
|
b := [u64(0), 0x8000]
|
|
mut q := []u64{cap: a.len - b.len + 1}
|
|
mut r := []u64{cap: a.len}
|
|
|
|
divide_digit_array(a, b, mut q, mut r)
|
|
assert q == [u64(0xa000_00000000), 0x6000_00000000]
|
|
assert r == [u64(2), 4]
|
|
}
|
|
|
|
fn test_many_divisions() {
|
|
for _ in 0 .. 100 {
|
|
a := random_number(30)
|
|
b := random_number(30)
|
|
c := a * b
|
|
assert c / a == b
|
|
assert c / b == a
|
|
q, r := a.div_mod(b)
|
|
assert (q * b) + r == a
|
|
}
|
|
}
|
|
|
|
fn random_number(length int) Integer {
|
|
numbers := '0123456789'
|
|
mut stri := ''
|
|
for _ in 0 .. length {
|
|
i := rand.intn(10) or { 0 }
|
|
nr := numbers[i]
|
|
stri = stri + nr.ascii_str()
|
|
}
|
|
res := integer_from_string(stri) or { panic(err) }
|
|
return res
|
|
}
|