Source file
src/math/log.go
1
2
3
4
5 package math
6
7
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
78
79
80
81 func Log(x float64) float64 {
82 if haveArchLog {
83 return archLog(x)
84 }
85 return log(x)
86 }
87
88 func log(x float64) float64 {
89 const (
90 Ln2Hi = 6.93147180369123816490e-01
91 Ln2Lo = 1.90821492927058770002e-10
92 L1 = 6.666666666666735130e-01
93 L2 = 3.999999999940941908e-01
94 L3 = 2.857142874366239149e-01
95 L4 = 2.222219843214978396e-01
96 L5 = 1.818357216161805012e-01
97 L6 = 1.531383769920937332e-01
98 L7 = 1.479819860511658591e-01
99 )
100
101
102 switch {
103 case IsNaN(x) || IsInf(x, 1):
104 return x
105 case x < 0:
106 return NaN()
107 case x == 0:
108 return Inf(-1)
109 }
110
111
112 f1, ki := Frexp(x)
113 if f1 < Sqrt2/2 {
114 f1 *= 2
115 ki--
116 }
117 f := f1 - 1
118 k := float64(ki)
119
120
121 s := f / (2 + f)
122 s2 := s * s
123 s4 := s2 * s2
124 t1 := s2 * (L1 + s4*(L3+s4*(L5+s4*L7)))
125 t2 := s4 * (L2 + s4*(L4+s4*L6))
126 R := t1 + t2
127 hfsq := 0.5 * f * f
128 return k*Ln2Hi - ((hfsq - (s*(hfsq+R) + k*Ln2Lo)) - f)
129 }
130
View as plain text