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> ______________________________________________ R-devel@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-devel