diff options
Diffstat (limited to 'v_windows/v/examples/spectral.v')
-rw-r--r-- | v_windows/v/examples/spectral.v | 68 |
1 files changed, 68 insertions, 0 deletions
diff --git a/v_windows/v/examples/spectral.v b/v_windows/v/examples/spectral.v new file mode 100644 index 0000000..88451af --- /dev/null +++ b/v_windows/v/examples/spectral.v @@ -0,0 +1,68 @@ +/* +https://benchmarksgame-team.pages.debian.net/benchmarksgame/performance/spectralnorm.html +Added: Pradeep Verghese +Benchmarks: +Used v -prod spectral.v +Command: time ./spectral 5500 +Output: 1.274224153 + +Time: 11.67s user 0.02s system 99% cpu 11.721 total +*/ +module main + +import math +import os +import strconv + +fn evala(i int, j int) int { + return ((i + j) * (i + j + 1) / 2 + i + 1) +} + +fn times(mut v []f64, u []f64) { + for i in 0 .. v.len { + mut a := f64(0) + for j in 0 .. u.len { + a += u[j] / f64(evala(i, j)) + } + v[i] = a + } +} + +fn times_trans(mut v []f64, u []f64) { + for i in 0 .. v.len { + mut a := f64(0) + for j in 0 .. u.len { + a += u[j] / f64(evala(j, i)) + } + v[i] = a + } +} + +fn a_times_transp(mut v []f64, u []f64) { + mut x := []f64{len: u.len, init: 0} + times(mut x, u) + times_trans(mut v, x) +} + +fn main() { + mut n := 0 + if os.args.len == 2 { + n = strconv.atoi(os.args[1]) or { 0 } + } else { + n = 0 + } + mut u := []f64{len: n, init: 1} + mut v := []f64{len: n, init: 1} + for _ in 0 .. 10 { + a_times_transp(mut v, u) + a_times_transp(mut u, v) + } + mut vbv := f64(0) + mut vv := f64(0) + for i in 0 .. n { + vbv += u[i] * v[i] + vv += v[i] * v[i] + } + ans := math.sqrt(vbv / vv) + println('${ans:0.9f}') +} |