[Rd] Different results for cos,sin,tan and cospi,sinpi,tanpi
Ei-ji Nakama
nakama at ki.rim.or.jp
Thu Dec 1 06:39:55 CET 2016
Hi,
i try sin, cos, and tan.
> sapply(c(cos,sin,tan),function(x,y)x(y),1.23e45*pi)
[1] 0.5444181 0.8388140 1.5407532
However, *pi results the following
> sapply(c(cospi,sinpi,tanpi),function(x,y)x(y),1.23e45)
[1] 1 0 0
Please try whether the following becomes all right.
diff -ruN R-3.3.2.orig/src/nmath/cospi.c R-3.3.2/src/nmath/cospi.c
--- R-3.3.2.orig/src/nmath/cospi.c 2016-09-15 07:15:31.000000000 +0900
+++ R-3.3.2/src/nmath/cospi.c 2016-12-01 13:54:38.863357149 +0900
@@ -35,7 +35,11 @@
#endif
if(!R_FINITE(x)) ML_ERR_return_NAN;
- x = fmod(fabs(x), 2.);// cos() symmetric; cos(pi(x + 2k)) ==
cos(pi x) for all integer k
+ x = fabs(x);
+ if ( x > 9007199254740991 ) /* 2^53-1 */
+ return cos(M_PI * x);
+
+ x = fmod(x, 2.);// cos() symmetric; cos(pi(x + 2k)) == cos(pi x)
for all integer k
if(fmod(x, 1.) == 0.5) return 0.;
if( x == 1.) return -1.;
if( x == 0.) return 1.;
@@ -57,6 +61,9 @@
#endif
if(!R_FINITE(x)) ML_ERR_return_NAN;
+ if (( x > 9007199254740991 )|| /* 2^53-1 */
+ ( x < -9007199254740991 ) ) /* -2^53-1 */
+ return sin(M_PI * x);
x = fmod(x, 2.); // sin(pi(x + 2k)) == sin(pi x) for all integer k
// map (-2,2) --> (-1,1] :
if(x <= -1) x += 2.; else if (x > 1.) x -= 2.;
@@ -81,6 +88,10 @@
#endif
if(!R_FINITE(x)) ML_ERR_return_NAN;
+ if (( x > 9007199254740991 )|| /* 2^53-1 */
+ ( x < -9007199254740991 ) ) /* -2^53-1 */
+ return tan(M_PI * x);
+
x = fmod(x, 1.); // tan(pi(x + k)) == tan(pi x) for all integer k
// map (-1,1) --> (-1/2, 1/2] :
if(x <= -0.5) x++; else if(x > 0.5) x--;
--
Best Regards,
--
Eiji NAKAMA <nakama (a) ki.rim.or.jp>
"\u4e2d\u9593\u6804\u6cbb" <nakama (a) ki.rim.or.jp>
More information about the R-devel
mailing list