v2 / vlib / v / gen / wasm / tests / arith.vv
143 lines · 122 sloc · 1.76 KB · 8abf69389e166180d4ad2db2ab253e4b7fda7668
Raw
1fn mul(a i64, unsigned u32) f64 {
2 mut one := a
3
4 one *= 2 / unsigned
5
6 return f64(one)
7}
8
9fn typ(a int) i64 {
10 mut one := a
11 sec := one + i64(a)
12
13 return sec
14}
15
16pub fn gcd(a_ i64, b_ i64) i64 {
17 mut a := a_
18 mut b := b_
19 if a < 0 {
20 a = -a
21 }
22 if b < 0 {
23 b = -b
24 }
25 for b != 0 {
26 a %= b
27 if a == 0 {
28 return b
29 }
30 b %= a
31 }
32 return a
33}
34
35pub fn lcm(a i64, b i64) i64 {
36 if a == 0 {
37 return a
38 }
39 res := a * (b / gcd(b, a))
40 if res < 0 {
41 return -res
42 }
43 return res
44}
45
46pub fn inc(a f64) int {
47 mut b := a
48 b++
49 b--
50 return int(b)
51}
52
53pub fn negate(a int) i64 {
54 return ~a + 1
55}
56
57pub fn powi(a i64, b i64) i64 {
58 mut b_ := b
59 mut p := a
60 mut v := i64(1)
61
62 if b_ < 0 { // exponent < 0
63 if a == 0 {
64 return -1 // division by 0
65 }
66 return if a * a != 1 {
67 0
68 } else {
69 if (b_ & 1) > 0 {
70 a
71 } else {
72 1
73 }
74 }
75 }
76
77 for b_ > 0 {
78 if b_ & 1 > 0 {
79 v *= p
80 }
81 p *= p
82 b_ >>= 1
83 }
84
85 return v
86}
87
88pub fn sqrti(a i64) i64 {
89 mut x := a
90 mut q, mut r := i64(1), i64(0)
91 for ; q <= x; {
92 q <<= 2
93 }
94 for ; q > 1; {
95 q >>= 2
96 t := x - r - q
97 r >>= 1
98 if t >= 0 {
99 x = t
100 r += q
101 }
102 }
103 return r
104}
105
106fn main() {
107 println('--- test printing numbers')
108 println(-20)
109 println(0)
110 println(22)
111 println(-1000000022)
112
113 println('--- test powi')
114 println(powi(2, 62))
115 println(powi(0, -2))
116 println(powi(2, -1))
117
118 println('--- test sqrti')
119 println(sqrti(i64(123456789) * i64(123456789)))
120 println(sqrti(144))
121 println(sqrti(0))
122
123 println('--- test negate')
124 println(negate(20))
125 println(negate(-1))
126
127 println('--- test inc')
128 println(inc(20))
129 println(inc(-1))
130
131 println('--- test lcm')
132 println(lcm(2, 3))
133 println(lcm(-2, 3))
134 println(lcm(-2, -3))
135 println(lcm(0, 0))
136
137 println('--- test gcd')
138
139 println(gcd(6, 9))
140 println(gcd(6, -9))
141 println(gcd(-6, -9))
142 println(gcd(0, 0))
143}
144