v / examples
Raw file | 68 loc (61 sloc) | 1.19 KB | Latest commit hash e5360e164
1/*
2https://benchmarksgame-team.pages.debian.net/benchmarksgame/performance/spectralnorm.html
3Added: Pradeep Verghese
4Benchmarks:
5Used v -prod spectral.v
6Command: time ./spectral 5500
7Output: 1.274224153
8
9Time: 11.67s user 0.02s system 99% cpu 11.721 total
10*/
11module main
12
13import math
14import os
15import strconv
16
17fn evala(i int, j int) int {
18 return (i + j) * (i + j + 1) / 2 + i + 1
19}
20
21fn times(mut v []f64, u []f64) {
22 for i in 0 .. v.len {
23 mut a := f64(0)
24 for j in 0 .. u.len {
25 a += u[j] / f64(evala(i, j))
26 }
27 v[i] = a
28 }
29}
30
31fn times_trans(mut v []f64, u []f64) {
32 for i in 0 .. v.len {
33 mut a := f64(0)
34 for j in 0 .. u.len {
35 a += u[j] / f64(evala(j, i))
36 }
37 v[i] = a
38 }
39}
40
41fn a_times_transp(mut v []f64, u []f64) {
42 mut x := []f64{len: u.len, init: 0}
43 times(mut x, u)
44 times_trans(mut v, x)
45}
46
47fn main() {
48 mut n := 0
49 if os.args.len == 2 {
50 n = strconv.atoi(os.args[1]) or { 0 }
51 } else {
52 n = 0
53 }
54 mut u := []f64{len: n, init: 1}
55 mut v := []f64{len: n, init: 1}
56 for _ in 0 .. 10 {
57 a_times_transp(mut v, u)
58 a_times_transp(mut u, v)
59 }
60 mut vbv := f64(0)
61 mut vv := f64(0)
62 for i in 0 .. n {
63 vbv += u[i] * v[i]
64 vv += v[i] * v[i]
65 }
66 ans := math.sqrt(vbv / vv)
67 println('${ans:0.9f}')
68}