File: sum_ex.ml

package info (click to toggle)
ocamlgsl 1.19.1-1
  • links: PTS, VCS
  • area: main
  • in suites: stretch
  • size: 1,628 kB
  • ctags: 2,812
  • sloc: ml: 17,194; ansic: 7,445; makefile: 24
file content (46 lines) | stat: -rw-r--r-- 1,352 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
open Gsl

let _ = 
  Error.init ()

let zeta2 = Math.pi *. Math.pi /. 6.

let zeta_terms n =
  let t = Array.make n 0. in
  let sum = ref 0. in
  for i=0 to pred n do
    let np1 = float (i + 1) in
    t.(i) <- 1. /. (np1 *. np1) ;
    sum := !sum +. t.(i)
  done ;
  (t, !sum)

let print_res sum nbterms sum_accel sum_plain nbterms_accel =
  Printf.printf "term-by-term sum = % .16f using %d terms\n"
    sum nbterms ;
  Printf.printf "term-by-term sum = % .16f using %d terms\n"
    sum_plain nbterms_accel ;
  Printf.printf "exact value      = % .16f\n" zeta2 ;
  Printf.printf "accelerated sum  = % .16f using %d terms\n"
    sum_accel.Fun.res nbterms_accel ;
  Printf.printf "estimated error  = % .16f\n"
    sum_accel.Fun.err ;
  Printf.printf "actual error     = % .16f\n"
    (sum_accel.Fun.res -. zeta2)

let _ = 
  let n = 20 in
  let (t, sum) = zeta_terms n in
  let ws = Sum.make n in
  let res = Sum.accel t ws in
  let { Sum.sum_plain = sum_plain ;
	Sum.terms_used = nbterms_used } = Sum.get_info ws in
  print_res sum n res sum_plain nbterms_used ;
  print_newline ();
  print_endline "\"truncated\" version:" ;
  let ws = Sum.Trunc.make n in
  let res = Sum.Trunc.accel t ws in
  let { Sum.Trunc.sum_plain = sum_plain ;
	Sum.Trunc.terms_used = nbterms_used } = 
    Sum.Trunc.get_info ws in
  print_res sum n res sum_plain nbterms_used