-
Notifications
You must be signed in to change notification settings - Fork 4
/
number-spacings.go
77 lines (65 loc) · 1.22 KB
/
number-spacings.go
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
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
/*
https://en.wikipedia.org/wiki/Linear_scale
https://en.wikipedia.org/wiki/Logarithmic_scale
*/
package main
import (
"flag"
"fmt"
"math"
"os"
"strconv"
)
var (
base = flag.Float64("b", 10, "specify base for logspace")
)
func main() {
flag.Parse()
if flag.NArg() < 3 {
usage()
}
t0, _ := strconv.ParseFloat(flag.Arg(0), 64)
t1, _ := strconv.ParseFloat(flag.Arg(1), 64)
n, _ := strconv.Atoi(flag.Arg(2))
fmt.Printf("linspace\n")
fmt.Printf("%v\n", linspace(t0, t1, n))
fmt.Printf("logspace\n")
fmt.Printf("%v\n", logspace(t0, t1, n, *base))
}
func usage() {
fmt.Fprintln(os.Stderr, "usage: [options] <start> <end> <samples>")
flag.PrintDefaults()
os.Exit(2)
}
func linspace(t0, t1 float64, n int) []float64 {
if n <= 0 {
return []float64{}
}
if n == 1 {
return []float64{t0}
}
var p []float64
t := t0
dt := (t1 - t0) / float64(n-1)
for i := 0; i < n; i++ {
p = append(p, t)
t += dt
}
return p
}
func logspace(t0, t1 float64, n int, b float64) []float64 {
if n <= 0 {
return []float64{}
}
if n == 1 {
return []float64{math.Pow(b, t0)}
}
var p []float64
t := math.Pow(b, t0)
dt := math.Pow(b, (t1-t0)/float64(n-1))
for i := 0; i < n; i++ {
p = append(p, t)
t *= dt
}
return p
}