/fn/fn.go

https://code.google.com/p/go-fn/ · Go · 166 lines · 134 code · 20 blank · 12 comment · 13 complexity · 693919349e51d666977caad312632d9c MD5 · raw file

  1. // Copyright 2012 - 2013 The Fn Authors. All rights reserved. See the LICENSE file.
  2. package fn
  3. // Special math functions.
  4. import (
  5. "math"
  6. )
  7. const π = float64(math.Pi)
  8. const ln2 = math.Ln2
  9. const lnSqrt2π = 0.918938533204672741780329736406 // log(sqrt(2*pi))
  10. const min64 = math.SmallestNonzeroFloat64 // DBL_MIN
  11. const eps64 = 1.1102230246251565e-16 // DBL_EPSILON
  12. const maxExp = 1024.0 // DBL_MAX_EXP
  13. const sqrt2 = math.Sqrt2
  14. const lnSqrtπd2 = 0.225791352644727432363097614947 // log(sqrt(pi/2)) M_LN_SQRT_PId2
  15. var nan = math.NaN()
  16. var fZero float64 = float64(0.0)
  17. var fOne float64 = float64(1.0)
  18. var iZero int64 = int64(0)
  19. var iOne int64 = int64(1)
  20. var negInf float64 = math.Inf(-1)
  21. var posInf float64 = math.Inf(+1)
  22. // Functions imported from "math"
  23. var abs func(float64) float64 = math.Abs
  24. var floor func(float64) float64 = math.Floor
  25. var ceil func(float64) float64 = math.Ceil
  26. var log func(float64) float64 = math.Log
  27. var log1p func(float64) float64 = math.Log1p
  28. var exp func(float64) float64 = math.Exp
  29. var sqrt func(float64) float64 = math.Sqrt
  30. var pow func(float64, float64) float64 = math.Pow
  31. var atan func(float64) float64 = math.Atan
  32. var tan func(float64) float64 = math.Tan
  33. var sin func(float64) float64 = math.Sin
  34. var trunc func(float64) float64 = math.Trunc
  35. var erf func(float64) float64 = math.Erf
  36. var erfc func(float64) float64 = math.Erfc
  37. var isNaN func(float64) bool = math.IsNaN
  38. var isInf func(float64, int) bool = math.IsInf
  39. var fmod func(float64, float64) float64 = math.Mod
  40. var Γ = math.Gamma
  41. var GammaF = math.Gamma
  42. var sqrt2pi = math.Sqrt(2 * math.Pi)
  43. var logsqrt2pi = math.Log(math.Sqrt(2 * math.Pi))
  44. var LnΓp = LnGammaP
  45. var LnΓpRatio = LnGammaPRatio
  46. var lanczos_coef []float64 = []float64{
  47. 0.99999999999980993,
  48. 676.5203681218851,
  49. -1259.1392167224028,
  50. 771.32342877765313,
  51. -176.61502916214059,
  52. 12.507343278686905,
  53. -0.13857109526572012,
  54. 9.9843695780195716e-6,
  55. 1.5056327351493116e-7}
  56. func isOdd(k float64) bool {
  57. if k != 2*floor(k/2.0) {
  58. return true
  59. }
  60. return false
  61. }
  62. func isInt(x float64) bool {
  63. if abs((x)-floor((x)+0.5)) <= 1e-7 {
  64. return true
  65. }
  66. return false
  67. }
  68. // Round to nearest integer
  69. func Round(x float64) float64 {
  70. var i float64
  71. f := math.Floor(x)
  72. c := math.Ceil(x)
  73. if x-f < c-x {
  74. i = f
  75. } else {
  76. i = c
  77. }
  78. return i
  79. }
  80. // Arithmetic mean
  81. func ArithMean(data *Vector) float64 {
  82. n := data.L
  83. sum := 0.0
  84. for i := 0; i < n; i++ {
  85. sum += data.Get(i)
  86. }
  87. return sum / float64(n)
  88. }
  89. // Geometric mean
  90. func GeomMean(data *Vector) float64 {
  91. n := data.L
  92. sum := 0.0
  93. for i := 0; i < n; i++ {
  94. sum += math.Log(data.Get(i))
  95. }
  96. return math.Exp(sum / float64(n))
  97. }
  98. // Harmonic mean
  99. func HarmonicMean(data *Vector) float64 {
  100. n := data.L
  101. sum := 0.0
  102. for i := 0; i < n; i++ {
  103. sum += 1.0 / data.Get(i)
  104. }
  105. return float64(n) / sum
  106. }
  107. // Generalized mean
  108. func GenMean(data *Vector, p float64) float64 {
  109. n := data.L
  110. sum := 0.0
  111. for i := 0; i < n; i++ {
  112. sum += math.Pow(data.Get(i), p)
  113. }
  114. return math.Pow(sum/float64(n), 1/p)
  115. }
  116. // Bernoulli number
  117. // Akiyama–Tanigawa algorithm for Bn
  118. func Bn(n int64) float64 {
  119. var m int64
  120. a := make([]float64, n)
  121. for m = 0; m <= n; m++ {
  122. a[m] = 1 / float64(m+1)
  123. for j := m; j >= 1; j-- {
  124. a[j-1] = float64(j) * (a[j-1] - a[j])
  125. }
  126. }
  127. return a[0] // (which is Bn)
  128. }
  129. // H returns the generalized harmonic number of order n of m.
  130. func H(n int64, m float64) float64 {
  131. var i int64
  132. h := 0.0
  133. for i = 1; i <= n; i++ {
  134. h += math.Pow(float64(i), m)
  135. }
  136. return h
  137. }
  138. // Generalized harmonic number
  139. func H2(n int64, q, s float64) float64 {
  140. var i int64
  141. h := 0.0
  142. for i = 1; i <= n; i++ {
  143. h += math.Pow((float64(i) + q), -s)
  144. }
  145. return h
  146. }