redo and clean up math.
R=r
DELTA=243 (60 added, 72 deleted, 111 changed)
OCL=22909
CL=22912
diff --git a/src/lib/math/Makefile b/src/lib/math/Makefile
index ef31b17..d0debdb 100644
--- a/src/lib/math/Makefile
+++ b/src/lib/math/Makefile
@@ -32,40 +32,40 @@
$(AS) $*.s
O1=\
- atan.$O\
exp.$O\
fabs.$O\
floor.$O\
fmod.$O\
hypot.$O\
pow10.$O\
- sin.$O\
sqrt.$O\
- tan.$O\
const.$O\
O2=\
- asin.$O\
- atan2.$O\
+ atan.$O\
log.$O\
+ sin.$O\
sinh.$O\
+ tan.$O\
O3=\
+ asin.$O\
+ atan2.$O\
pow.$O\
tanh.$O\
math.a: a1 a2 a3
a1: $(O1)
- $(AR) grc math.a atan.$O exp.$O fabs.$O floor.$O fmod.$O hypot.$O pow10.$O sin.$O sqrt.$O tan.$O const.$O
+ $(AR) grc math.a exp.$O fabs.$O floor.$O fmod.$O hypot.$O pow10.$O sqrt.$O const.$O
rm -f $(O1)
a2: $(O2)
- $(AR) grc math.a asin.$O atan2.$O log.$O sinh.$O
+ $(AR) grc math.a atan.$O log.$O sin.$O sinh.$O tan.$O
rm -f $(O2)
a3: $(O3)
- $(AR) grc math.a pow.$O tanh.$O
+ $(AR) grc math.a asin.$O atan2.$O pow.$O tanh.$O
rm -f $(O3)
newpkg: clean
diff --git a/src/lib/math/all_test.go b/src/lib/math/all_test.go
index ddcb1e3..fa0cc7c 100644
--- a/src/lib/math/all_test.go
+++ b/src/lib/math/all_test.go
@@ -154,7 +154,7 @@
-9.9999994291374019e-01,
}
-func Tolerance(a,b,e float64) bool {
+func tolerance(a,b,e float64) bool {
d := a-b;
if d < 0 {
d = -d;
@@ -168,16 +168,16 @@
}
return d < e;
}
-func Close(a,b float64) bool {
- return Tolerance(a, b, 1e-14);
+func close(a,b float64) bool {
+ return tolerance(a, b, 1e-14);
}
-func VeryClose(a,b float64) bool {
- return Tolerance(a, b, 4e-16);
+func veryclose(a,b float64) bool {
+ return tolerance(a, b, 4e-16);
}
export func TestAsin(t *testing.T) {
for i := 0; i < len(vf); i++ {
- if f := math.Asin(vf[i]/10); !VeryClose(asin[i], f) {
+ if f := math.Asin(vf[i]/10); !veryclose(asin[i], f) {
t.Errorf("math.Asin(%g) = %g, want %g\n", vf[i]/10, f, asin[i]);
}
}
@@ -185,7 +185,7 @@
export func TestAtan(t *testing.T) {
for i := 0; i < len(vf); i++ {
- if f := math.Atan(vf[i]); !VeryClose(atan[i], f) {
+ if f := math.Atan(vf[i]); !veryclose(atan[i], f) {
t.Errorf("math.Atan(%g) = %g, want %g\n", vf[i], f, atan[i]);
}
}
@@ -193,7 +193,7 @@
export func TestExp(t *testing.T) {
for i := 0; i < len(vf); i++ {
- if f := math.Exp(vf[i]); !VeryClose(exp[i], f) {
+ if f := math.Exp(vf[i]); !veryclose(exp[i], f) {
t.Errorf("math.Exp(%g) = %g, want %g\n", vf[i], f, exp[i]);
}
}
@@ -214,15 +214,14 @@
t.Errorf("math.Log(%g) = %g, want %g\n", a, f, log[i]);
}
}
- const Ln10 = 2.30258509299404568401799145468436421;
- if f := math.Log(10); f != Ln10 {
- t.Errorf("math.Log(%g) = %g, want %g\n", 10, f, Ln10);
+ if f := math.Log(10); f != math.Ln10 {
+ t.Errorf("math.Log(%g) = %g, want %g\n", 10, f, math.Ln10);
}
}
export func TestPow(t *testing.T) {
for i := 0; i < len(vf); i++ {
- if f := math.Pow(10, vf[i]); !Close(pow[i], f) {
+ if f := math.Pow(10, vf[i]); !close(pow[i], f) {
t.Errorf("math.Pow(10, %.17g) = %.17g, want %.17g\n", vf[i], f, pow[i]);
}
}
@@ -230,7 +229,7 @@
export func TestSin(t *testing.T) {
for i := 0; i < len(vf); i++ {
- if f := math.Sin(vf[i]); !Close(sin[i], f) {
+ if f := math.Sin(vf[i]); !close(sin[i], f) {
t.Errorf("math.Sin(%g) = %g, want %g\n", vf[i], f, sin[i]);
}
}
@@ -238,7 +237,7 @@
export func TestSinh(t *testing.T) {
for i := 0; i < len(vf); i++ {
- if f := math.Sinh(vf[i]); !VeryClose(sinh[i], f) {
+ if f := math.Sinh(vf[i]); !veryclose(sinh[i], f) {
t.Errorf("math.Sinh(%g) = %g, want %g\n", vf[i], f, sinh[i]);
}
}
@@ -247,7 +246,7 @@
export func TestSqrt(t *testing.T) {
for i := 0; i < len(vf); i++ {
a := math.Fabs(vf[i]);
- if f := math.Sqrt(a); !VeryClose(sqrt[i], f) {
+ if f := math.Sqrt(a); !veryclose(sqrt[i], f) {
t.Errorf("math.Sqrt(%g) = %g, want %g\n", a, f, floor[i]);
}
}
@@ -255,7 +254,7 @@
export func TestTan(t *testing.T) {
for i := 0; i < len(vf); i++ {
- if f := math.Tan(vf[i]); !Close(tan[i], f) {
+ if f := math.Tan(vf[i]); !close(tan[i], f) {
t.Errorf("math.Tan(%g) = %g, want %g\n", vf[i], f, tan[i]);
}
}
@@ -263,7 +262,7 @@
export func TestTanh(t *testing.T) {
for i := 0; i < len(vf); i++ {
- if f := math.Tanh(vf[i]); !VeryClose(tanh[i], f) {
+ if f := math.Tanh(vf[i]); !veryclose(tanh[i], f) {
t.Errorf("math.Tanh(%g) = %g, want %g\n", vf[i], f, tanh[i]);
}
}
@@ -272,7 +271,7 @@
export func TestHypot(t *testing.T) {
for i := 0; i < len(vf); i++ {
a := math.Fabs(tanh[i]*math.Sqrt(2));
- if f := math.Hypot(tanh[i], tanh[i]); !VeryClose(a, f) {
+ if f := math.Hypot(tanh[i], tanh[i]); !veryclose(a, f) {
t.Errorf("math.Hypot(%g, %g) = %g, want %g\n", tanh[i], tanh[i], f, a);
}
}
diff --git a/src/lib/math/asin.go b/src/lib/math/asin.go
index effaba8..e866d95 100644
--- a/src/lib/math/asin.go
+++ b/src/lib/math/asin.go
@@ -13,11 +13,6 @@
* Arctan is called after appropriate range reduction.
*/
-const
-(
- pio2 = .15707963267948966192313216e1
-)
-
export func Asin(arg float64) float64 {
var temp, x float64;
var sign bool;
@@ -34,7 +29,7 @@
temp = Sqrt(1 - x*x);
if x > 0.7 {
- temp = pio2 - Atan(temp/x);
+ temp = Pi/2 - Atan(temp/x);
} else {
temp = Atan(x/temp);
}
@@ -49,5 +44,5 @@
if arg > 1 || arg < -1 {
return sys.NaN();
}
- return pio2 - Asin(arg);
+ return Pi/2 - Asin(arg);
}
diff --git a/src/lib/math/atan.go b/src/lib/math/atan.go
index f2fd7ed..730d50a 100644
--- a/src/lib/math/atan.go
+++ b/src/lib/math/atan.go
@@ -4,6 +4,8 @@
package math
+import "math"
+
/*
* floating-point arctangent
*
@@ -13,32 +15,27 @@
* coefficients are #5077 from Hart & Cheney. (19.56D)
*/
-const
-(
- ap4 = .161536412982230228262e2;
- ap3 = .26842548195503973794141e3;
- ap2 = .11530293515404850115428136e4;
- ap1 = .178040631643319697105464587e4;
- ap0 = .89678597403663861959987488e3;
- aq4 = .5895697050844462222791e2;
- aq3 = .536265374031215315104235e3;
- aq2 = .16667838148816337184521798e4;
- aq1 = .207933497444540981287275926e4;
- aq0 = .89678597403663861962481162e3;
- apio2 = .15707963267948966192313216e1;
- apio4 = .7853981633974483096156608e0;
- asq2p1 = .2414213562373095048802e1; // sqrt(2)+1
- asq2m1 = .414213562373095048802e0; // sqrt(2)-1
-)
-
/*
* xatan evaluates a series valid in the
* range [-0.414...,+0.414...]. (tan(pi/8))
*/
func xatan(arg float64) float64 {
- argsq := arg*arg;
- value := ((((ap4*argsq + ap3)*argsq + ap2)*argsq + ap1)*argsq + ap0);
- value = value/(((((argsq + aq4)*argsq + aq3)*argsq + aq2)*argsq + aq1)*argsq + aq0);
+ const
+ (
+ P4 = .161536412982230228262e2;
+ P3 = .26842548195503973794141e3;
+ P2 = .11530293515404850115428136e4;
+ P1 = .178040631643319697105464587e4;
+ P0 = .89678597403663861959987488e3;
+ Q4 = .5895697050844462222791e2;
+ Q3 = .536265374031215315104235e3;
+ Q2 = .16667838148816337184521798e4;
+ Q1 = .207933497444540981287275926e4;
+ Q0 = .89678597403663861962481162e3;
+ )
+ sq := arg*arg;
+ value := ((((P4*sq + P3)*sq + P2)*sq + P1)*sq + P0);
+ value = value/(((((sq + Q4)*sq + Q3)*sq + Q2)*sq + Q1)*sq + Q0);
return value*arg;
}
@@ -47,13 +44,13 @@
* to the range [0,0.414...] and calls xatan.
*/
func satan(arg float64) float64 {
- if arg < asq2m1 {
+ if arg < Sqrt2 - 1 {
return xatan(arg);
}
- if arg > asq2p1 {
- return apio2 - xatan(1/arg);
+ if arg > Sqrt2 + 1 {
+ return Pi/2 - xatan(1/arg);
}
- return apio4 + xatan((arg-1)/(arg+1));
+ return Pi/4 + xatan((arg-1)/(arg+1));
}
/*
diff --git a/src/lib/math/atan2.go b/src/lib/math/atan2.go
index f0b3842..f8c00aa2 100644
--- a/src/lib/math/atan2.go
+++ b/src/lib/math/atan2.go
@@ -10,26 +10,19 @@
* atan2 discovers what quadrant the angle
* is in and calls atan.
*/
-
-const
-(
- pio2 = .15707963267948966192313216e1;
- pi = .3141592653589793238462643383276e1;
-)
-
export func Atan2(arg1, arg2 float64) float64 {
if arg1+arg2 == arg1 {
if arg1 >= 0 {
- return pio2;
+ return Pi/2;
}
- return -pio2;
+ return -Pi/2;
}
x := Atan(arg1/arg2);
if arg2 < 0 {
if x <= 0 {
- return x + pi;
+ return x + Pi;
}
- return x - pi;
+ return x - Pi;
}
return x;
}
diff --git a/src/lib/math/const.go b/src/lib/math/const.go
index a1c5f8e..927d6da 100644
--- a/src/lib/math/const.go
+++ b/src/lib/math/const.go
@@ -5,5 +5,20 @@
package math
export const (
- Sqrt2 = 1.41421356237309504880168872420969808;
+ // Mathematical constants.
+ // Reference: http://www.research.att.com/~njas/sequences/Axxxxxx
+
+ E = 2.71828182845904523536028747135266249775724709369995957496696763; // A001113
+ Pi = 3.14159265358979323846264338327950288419716939937510582097494459; // A000796
+ Phi = 1.61803398874989484820458683436563811772030917980576286213544862; // A001622
+
+ Sqrt2 = 1.41421356237309504880168872420969807856967187537694807317667974; // A002193
+ SqrtE = 1.64872127070012814684865078781416357165377610071014801157507931; // A019774
+ SqrtPi = 1.77245385090551602729816748334114518279754945612238712821380779; // A002161
+ SqrtPhi = 1.27201964951406896425242246173749149171560804184009624861664038; // A139339
+
+ Ln2 = 0.693147180559945309417232121458176568075500134360255254120680009; // A002162
+ Log2E = 1/Ln2;
+ Ln10 = 2.30258509299404568401799145468436420760110148862877297603332790; // A002392
+ Log10E = 1/Ln10;
)
diff --git a/src/lib/math/exp.go b/src/lib/math/exp.go
index e1402f0..efc17ae 100644
--- a/src/lib/math/exp.go
+++ b/src/lib/math/exp.go
@@ -82,26 +82,23 @@
// compiler will convert from decimal to binary accurately enough
// to produce the hexadecimal values shown.
-export const (
- Ln2 = 0.693147180559945309417232121458176568;
- HalfLn2 = 0.346573590279972654708616060729088284;
-
- Ln2Hi = 6.93147180369123816490e-01;
- Ln2Lo = 1.90821492927058770002e-10;
- Log2e = 1.44269504088896338700e+00;
-
- P1 = 1.66666666666666019037e-01; /* 0x3FC55555; 0x5555553E */
- P2 = -2.77777777770155933842e-03; /* 0xBF66C16C; 0x16BEBD93 */
- P3 = 6.61375632143793436117e-05; /* 0x3F11566A; 0xAF25DE2C */
- P4 = -1.65339022054652515390e-06; /* 0xBEBBBD41; 0xC5D26BF1 */
- P5 = 4.13813679705723846039e-08; /* 0x3E663769; 0x72BEA4D0 */
-
- Overflow = 7.09782712893383973096e+02;
- Underflow = -7.45133219101941108420e+02;
- NearZero = 1.0/(1<<28); // 2^-28
-)
-
export func Exp(x float64) float64 {
+ const (
+ Ln2Hi = 6.93147180369123816490e-01;
+ Ln2Lo = 1.90821492927058770002e-10;
+ Log2e = 1.44269504088896338700e+00;
+
+ P1 = 1.66666666666666019037e-01; /* 0x3FC55555; 0x5555553E */
+ P2 = -2.77777777770155933842e-03; /* 0xBF66C16C; 0x16BEBD93 */
+ P3 = 6.61375632143793436117e-05; /* 0x3F11566A; 0xAF25DE2C */
+ P4 = -1.65339022054652515390e-06; /* 0xBEBBBD41; 0xC5D26BF1 */
+ P5 = 4.13813679705723846039e-08; /* 0x3E663769; 0x72BEA4D0 */
+
+ Overflow = 7.09782712893383973096e+02;
+ Underflow = -7.45133219101941108420e+02;
+ NearZero = 1.0/(1<<28); // 2^-28
+ )
+
// special cases
switch {
case sys.isNaN(x) || sys.isInf(x, 1):
diff --git a/src/lib/math/log.go b/src/lib/math/log.go
index 9c54858..5eee5dae 100644
--- a/src/lib/math/log.go
+++ b/src/lib/math/log.go
@@ -37,11 +37,11 @@
// 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) ~ L1*s +L2*s +L3*s +L4*s +L5*s +L6*s +L7*s
+// (the values of L1 to L7 are listed in the program)
// and
// | 2 14 | -58.45
-// | lg1*s +...+lg7*s - R(z) | <= 2
+// | L1*s +...+L7*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
@@ -49,11 +49,11 @@
// log(1+f) = f - s*(f - R) (if f is not too large)
// log(1+f) = f - (hfsq - s*(hfsq+R)). (better accuracy)
//
-// 3. Finally, log(x) = k*ln2 + log(1+f).
-// = k*ln2_hi+(f-(hfsq-(s*(hfsq+R)+k*ln2_lo)))
-// Here ln2 is split into two floating point number:
-// ln2_hi + ln2_lo,
-// where n*ln2_hi is always exact for |n| < 2000.
+// 3. Finally, log(x) = k*Ln2 + log(1+f).
+// = k*Ln2_hi+(f-(hfsq-(s*(hfsq+R)+k*Ln2_lo)))
+// Here Ln2 is split into two floating point number:
+// Ln2_hi + Ln2_lo,
+// where n*Ln2_hi is always exact for |n| < 2000.
//
// Special cases:
// log(x) is NaN with signal if x < 0 (including -INF) ;
@@ -70,19 +70,19 @@
// compiler will convert from decimal to binary accurately enough
// 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 */
-)
-
export func Log(x float64) float64 {
+ const (
+ Ln2Hi = 6.93147180369123816490e-01; /* 3fe62e42 fee00000 */
+ Ln2Lo = 1.90821492927058770002e-10; /* 3dea39ef 35793c76 */
+ L1 = 6.666666666666735130e-01; /* 3FE55555 55555593 */
+ L2 = 3.999999999940941908e-01; /* 3FD99999 9997FA04 */
+ L3 = 2.857142874366239149e-01; /* 3FD24924 94229359 */
+ L4 = 2.222219843214978396e-01; /* 3FCC71C5 1D8E78AF */
+ L5 = 1.818357216161805012e-01; /* 3FC74664 96CB03DE */
+ L6 = 1.531383769920937332e-01; /* 3FC39A09 D078C69F */
+ L7 = 1.479819860511658591e-01; /* 3FC2F112 DF3E5244 */
+ )
+
// special cases
switch {
case sys.isNaN(x) || sys.isInf(x, 1):
@@ -106,23 +106,18 @@
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*(L1 + s4*(L3 + s4*(L5 + s4*L7)));
+ t2 := s4*(L2 + s4*(L4 + s4*L6));
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
-(
- ln10u1 = .4342944819032518276511;
-)
-
export func Log10(arg float64) float64 {
if arg <= 0 {
return sys.NaN();
}
- return Log(arg) * ln10u1;
+ return Log(arg) * (1/Ln10);
}
diff --git a/src/lib/math/pow10.go b/src/lib/math/pow10.go
index e1e9c2e..1d0a0e0 100644
--- a/src/lib/math/pow10.go
+++ b/src/lib/math/pow10.go
@@ -13,25 +13,24 @@
* than multipication of lower powers of 10.
*/
-const tabsize = 70;
-var tab[tabsize] float64;
+var pow10tab [70]float64;
export func Pow10(e int) float64 {
if e < 0 {
return 1/Pow10(-e);
}
- if e < tabsize {
- return tab[e];
+ if e < len(pow10tab) {
+ return pow10tab[e];
}
m := e/2;
return Pow10(m) * Pow10(e-m);
}
func init() {
- tab[0] = 1.0e0;
- tab[1] = 1.0e1;
- for i:=2; i<tabsize; i++ {
+ pow10tab[0] = 1.0e0;
+ pow10tab[1] = 1.0e1;
+ for i:=2; i<len(pow10tab); i++ {
m := i/2;
- tab[i] = tab[m] * tab[i-m];
+ pow10tab[i] = pow10tab[m] * pow10tab[i-m];
}
}
diff --git a/src/lib/math/sin.go b/src/lib/math/sin.go
index 077506b..6e3fbb2 100644
--- a/src/lib/math/sin.go
+++ b/src/lib/math/sin.go
@@ -4,37 +4,34 @@
package math
-/*
- Coefficients are #3370 from Hart & Cheney (18.80D).
-*/
-const
-(
- sp0 = .1357884097877375669092680e8;
- sp1 = -.4942908100902844161158627e7;
- sp2 = .4401030535375266501944918e6;
- sp3 = -.1384727249982452873054457e5;
- sp4 = .1459688406665768722226959e3;
- sq0 = .8644558652922534429915149e7;
- sq1 = .4081792252343299749395779e6;
- sq2 = .9463096101538208180571257e4;
- sq3 = .1326534908786136358911494e3;
-
- spiu2 = .6366197723675813430755350e0; // 2/pi
-)
+import "math"
func sinus(arg float64, quad int) float64 {
+ // Coefficients are #3370 from Hart & Cheney (18.80D).
+ const
+ (
+ P0 = .1357884097877375669092680e8;
+ P1 = -.4942908100902844161158627e7;
+ P2 = .4401030535375266501944918e6;
+ P3 = -.1384727249982452873054457e5;
+ P4 = .1459688406665768722226959e3;
+ Q0 = .8644558652922534429915149e7;
+ Q1 = .4081792252343299749395779e6;
+ Q2 = .9463096101538208180571257e4;
+ Q3 = .1326534908786136358911494e3;
+ )
x := arg;
if(x < 0) {
x = -x;
quad = quad+2;
}
- x = x * spiu2; /* underflow? */
+ x = x * (2/Pi); /* underflow? */
var y float64;
if x > 32764 {
var e float64;
e, y = sys.modf(x);
e = e + float64(quad);
- temsp1, f := sys.modf(0.25*e);
+ temp1, f := sys.modf(0.25*e);
quad = int(e - 4*f);
} else {
k := int32(x);
@@ -49,10 +46,10 @@
y = -y;
}
- ysq := y*y;
- temsp1 := ((((sp4*ysq+sp3)*ysq+sp2)*ysq+sp1)*ysq+sp0)*y;
- temsp2 := ((((ysq+sq3)*ysq+sq2)*ysq+sq1)*ysq+sq0);
- return temsp1/temsp2;
+ yy := y*y;
+ temp1 := ((((P4*yy+P3)*yy+P2)*yy+P1)*yy+P0)*y;
+ temp2 := ((((yy+Q3)*yy+Q2)*yy+Q1)*yy+Q0);
+ return temp1/temp2;
}
export func Cos(arg float64) float64 {
diff --git a/src/lib/math/sinh.go b/src/lib/math/sinh.go
index 622467e..e0201ee 100644
--- a/src/lib/math/sinh.go
+++ b/src/lib/math/sinh.go
@@ -14,25 +14,25 @@
* greater in magnitude than 0.5.
*
* A series is used for arguments smaller in magnitude than 0.5.
- * The coefficients are #2029 from Hart & Cheney. (20.36D)
*
* cosh(arg) is computed from the exponential func for
* all arguments.
*/
-const
-(
- shp0 = -0.6307673640497716991184787251e+6;
- shp1 = -0.8991272022039509355398013511e+5;
- shp2 = -0.2894211355989563807284660366e+4;
- shp3 = -0.2630563213397497062819489e+2;
- shq0 = -0.6307673640497716991212077277e+6;
- shq1 = 0.1521517378790019070696485176e+5;
- shq2 = -0.173678953558233699533450911e+3;
-)
-
export func Sinh(arg float64) float64 {
- sign := false;
+ // The coefficients are #2029 from Hart & Cheney. (20.36D)
+ const
+ (
+ P0 = -0.6307673640497716991184787251e+6;
+ P1 = -0.8991272022039509355398013511e+5;
+ P2 = -0.2894211355989563807284660366e+4;
+ P3 = -0.2630563213397497062819489e+2;
+ Q0 = -0.6307673640497716991212077277e+6;
+ Q1 = 0.1521517378790019070696485176e+5;
+ Q2 = -0.173678953558233699533450911e+3;
+ )
+
+ sign := false;
if arg < 0 {
arg = -arg;
sign = true;
@@ -47,9 +47,9 @@
temp = (Exp(arg) - Exp(-arg))/2;
default:
- argsq := arg*arg;
- temp = (((shp3*argsq+shp2)*argsq+shp1)*argsq+shp0)*arg;
- temp = temp/(((argsq+shq2)*argsq+shq1)*argsq+shq0);
+ sq := arg*arg;
+ temp = (((P3*sq+P2)*sq+P1)*sq+P0)*arg;
+ temp = temp/(((sq+Q2)*sq+Q1)*sq+Q0);
}
if sign {
diff --git a/src/lib/math/tan.go b/src/lib/math/tan.go
index fff36c6..ddfe80d 100644
--- a/src/lib/math/tan.go
+++ b/src/lib/math/tan.go
@@ -4,25 +4,26 @@
package math
+import "math"
+
/*
* floating point tangent
- * Coefficients are #4285 from Hart & Cheney. (19.74D)
*/
-const
-(
- p0 = -.1306820264754825668269611177e+5;
- p1 = .1055970901714953193602353981e+4;
- p2 = -.1550685653483266376941705728e+2;
- p3 = .3422554387241003435328470489e-1;
- p4 = .3386638642677172096076369e-4;
- q0 = -.1663895238947119001851464661e+5;
- q1 = .4765751362916483698926655581e+4;
- q2 = -.1555033164031709966900124574e+3;
- piu4 = .1273239544735162686151070107e+1; // 4/pi
-)
-
export func Tan(arg float64) float64 {
+ // Coefficients are #4285 from Hart & Cheney. (19.74D)
+ const
+ (
+ P0 = -.1306820264754825668269611177e+5;
+ P1 = .1055970901714953193602353981e+4;
+ P2 = -.1550685653483266376941705728e+2;
+ P3 = .3422554387241003435328470489e-1;
+ P4 = .3386638642677172096076369e-4;
+ Q0 = -.1663895238947119001851464661e+5;
+ Q1 = .4765751362916483698926655581e+4;
+ Q2 = -.1555033164031709966900124574e+3;
+ )
+
flag := false;
sign := false;
x := arg;
@@ -30,7 +31,7 @@
x = -x;
sign = true;
}
- x = x * piu4; /* overflow? */
+ x = x * (4/Pi); /* overflow? */
var e float64;
e, x = sys.modf(x);
i := int32(e);
@@ -50,8 +51,8 @@
}
xsq := x*x;
- temp := ((((p4*xsq+p3)*xsq+p2)*xsq+p1)*xsq+p0)*x;
- temp = temp/(((xsq+q2)*xsq+q1)*xsq+q0);
+ temp := ((((P4*xsq+P3)*xsq+P2)*xsq+P1)*xsq+P0)*x;
+ temp = temp/(((xsq+Q2)*xsq+Q1)*xsq+Q0);
if flag {
if(temp == 0) {