summaryrefslogtreecommitdiff
path: root/src/lib/math/log.go
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/math/log.go')
-rw-r--r--src/lib/math/log.go37
1 files changed, 17 insertions, 20 deletions
diff --git a/src/lib/math/log.go b/src/lib/math/log.go
index c0cfebf8b..9c54858b4 100644
--- a/src/lib/math/log.go
+++ b/src/lib/math/log.go
@@ -4,6 +4,8 @@
package math
+import "math"
+
// The original C code, the long comment, and the constants
// below are from FreeBSD's /usr/src/lib/msun/src/e_log.c
// and came with this notice. The go code is a simpler
@@ -35,11 +37,11 @@ package math
// of this polynomial approximation is bounded by 2**-58.45. In
// other words,
// 2 4 6 8 10 12 14
-// R(z) ~ Lg1*s +Lg2*s +Lg3*s +Lg4*s +Lg5*s +Lg6*s +Lg7*s
-// (the values of Lg1 to Lg7 are listed in the program)
+// R(z) ~ lg1*s +lg2*s +lg3*s +lg4*s +lg5*s +lg6*s +lg7*s
+// (the values of lg1 to lg7 are listed in the program)
// and
// | 2 14 | -58.45
-// | Lg1*s +...+Lg7*s - R(z) | <= 2
+// | lg1*s +...+lg7*s - R(z) | <= 2
// | |
// Note that 2s = f - s*f = f - hfsq + s*hfsq, where hfsq = f*f/2.
// In order to guarantee error in log below 1ulp, we compute log
@@ -69,20 +71,15 @@ package math
// to produce the hexadecimal values shown.
const (
- Ln2Hi = 6.93147180369123816490e-01; /* 3fe62e42 fee00000 */
- Ln2Lo = 1.90821492927058770002e-10; /* 3dea39ef 35793c76 */
- Lg1 = 6.666666666666735130e-01; /* 3FE55555 55555593 */
- Lg2 = 3.999999999940941908e-01; /* 3FD99999 9997FA04 */
- Lg3 = 2.857142874366239149e-01; /* 3FD24924 94229359 */
- Lg4 = 2.222219843214978396e-01; /* 3FCC71C5 1D8E78AF */
- Lg5 = 1.818357216161805012e-01; /* 3FC74664 96CB03DE */
- Lg6 = 1.531383769920937332e-01; /* 3FC39A09 D078C69F */
- Lg7 = 1.479819860511658591e-01; /* 3FC2F112 DF3E5244 */
-
- Two54 = 1<<54; // 2^54
- TwoM20 = 1.0/(1<<20); // 2^-20
- TwoM1022 = 2.2250738585072014e-308; // 2^-1022
- Sqrt2 = 1.41421356237309504880168872420969808;
+ ln2Hi = 6.93147180369123816490e-01; /* 3fe62e42 fee00000 */
+ ln2Lo = 1.90821492927058770002e-10; /* 3dea39ef 35793c76 */
+ lg1 = 6.666666666666735130e-01; /* 3FE55555 55555593 */
+ lg2 = 3.999999999940941908e-01; /* 3FD99999 9997FA04 */
+ lg3 = 2.857142874366239149e-01; /* 3FD24924 94229359 */
+ lg4 = 2.222219843214978396e-01; /* 3FCC71C5 1D8E78AF */
+ lg5 = 1.818357216161805012e-01; /* 3FC74664 96CB03DE */
+ lg6 = 1.531383769920937332e-01; /* 3FC39A09 D078C69F */
+ lg7 = 1.479819860511658591e-01; /* 3FC2F112 DF3E5244 */
)
export func Log(x float64) float64 {
@@ -109,11 +106,11 @@ export func Log(x float64) float64 {
s := f/(2+f);
s2 := s*s;
s4 := s2*s2;
- t1 := s2*(Lg1 + s4*(Lg3 + s4*(Lg5 + s4*Lg7)));
- t2 := s4*(Lg2 + s4*(Lg4 + s4*Lg6));
+ t1 := s2*(lg1 + s4*(lg3 + s4*(lg5 + s4*lg7)));
+ t2 := s4*(lg2 + s4*(lg4 + s4*lg6));
R := t1 + t2;
hfsq := 0.5*f*f;
- return k*Ln2Hi - ((hfsq-(s*(hfsq+R)+k*Ln2Lo)) - f);
+ return k*ln2Hi - ((hfsq-(s*(hfsq+R)+k*ln2Lo)) - f);
}
const