mirror of
https://github.com/golang/go
synced 2024-11-19 11:14:47 -07:00
math: fix inaccurate result of Exp(1)
The existing implementation is translated from C, which uses a polynomial coefficient very close to 1/6. If the function uses 1/6 as this coeffient, the result of Exp(1) will be more accurate. And this change doesn't introduce more error to Exp function. Fixes #20319 Change-Id: I94c236a18cf95570ebb69f7fb99884b0d7cf5f6e Reviewed-on: https://go-review.googlesource.com/49294 Reviewed-by: Robert Griesemer <gri@golang.org>
This commit is contained in:
parent
3366f51544
commit
d46953c9f6
@ -953,6 +953,7 @@ var vfexpSC = []float64{
|
||||
// Issue 18912
|
||||
1.48852223e+09,
|
||||
1.4885222e+09,
|
||||
1,
|
||||
}
|
||||
var expSC = []float64{
|
||||
0,
|
||||
@ -963,6 +964,7 @@ var expSC = []float64{
|
||||
Inf(1),
|
||||
Inf(1),
|
||||
Inf(1),
|
||||
2.718281828459045,
|
||||
}
|
||||
|
||||
var vfexp2SC = []float64{
|
||||
|
@ -44,7 +44,7 @@ func Exp(x float64) float64
|
||||
// the interval [0,0.34658]:
|
||||
// Write
|
||||
// R(r**2) = r*(exp(r)+1)/(exp(r)-1) = 2 + r*r/6 - r**4/360 + ...
|
||||
// We use a special Remes algorithm on [0,0.34658] to generate
|
||||
// We use a special Remez algorithm on [0,0.34658] to generate
|
||||
// a polynomial of degree 5 to approximate R. The maximum error
|
||||
// of this polynomial approximation is bounded by 2**-59. In
|
||||
// other words,
|
||||
@ -175,7 +175,7 @@ func exp2(x float64) float64 {
|
||||
// exp1 returns e**r × 2**k where r = hi - lo and |r| ≤ ln(2)/2.
|
||||
func expmulti(hi, lo float64, k int) float64 {
|
||||
const (
|
||||
P1 = 1.66666666666666019037e-01 /* 0x3FC55555; 0x5555553E */
|
||||
P1 = 1.66666666666666657415e-01 /* 0x3FC55555; 0x55555555 */
|
||||
P2 = -2.77777777770155933842e-03 /* 0xBF66C16C; 0x16BEBD93 */
|
||||
P3 = 6.61375632143793436117e-05 /* 0x3F11566A; 0xAF25DE2C */
|
||||
P4 = -1.65339022054652515390e-06 /* 0xBEBBBD41; 0xC5D26BF1 */
|
||||
|
Loading…
Reference in New Issue
Block a user