@@ -11,7 +11,7 @@ export sin, cos, tan, sinh, cosh, tanh, asin, acos, atan,
11
11
cbrt, sqrt, erf, erfc, erfcx, erfi, dawson,
12
12
significand,
13
13
lgamma, hypot, gamma, lfact, max, min, minmax, ldexp, frexp,
14
- clamp, modf, ^ , mod2pi,
14
+ clamp, modf, ^ , mod2pi, rem2pi,
15
15
airy, airyai, airyprime, airyaiprime, airybi, airybiprime, airyx,
16
16
besselj0, besselj1, besselj, besseljx,
17
17
bessely0, bessely1, bessely, besselyx,
@@ -22,7 +22,7 @@ export sin, cos, tan, sinh, cosh, tanh, asin, acos, atan,
22
22
23
23
import Base: log, exp, sin, cos, tan, sinh, cosh, tanh, asin,
24
24
acos, atan, asinh, acosh, atanh, sqrt, log2, log10,
25
- max, min, minmax, ^ , exp2,
25
+ max, min, minmax, ^ , exp2, rem,
26
26
exp10, expm1, log1p,
27
27
sign_mask, exponent_mask, exponent_one, exponent_half,
28
28
significand_mask, significand_bits, exponent_bits, exponent_bias
@@ -247,6 +247,12 @@ function frexp{T<:FloatingPoint}(A::Array{T})
247
247
return (f, e)
248
248
end
249
249
250
+
251
+ rem (x:: Float64 , y:: Float64 , :: RoundingMode{:Nearest} ) =
252
+ ccall ((:remainder , libm),Float64,(Float64,Float64),x,y)
253
+ rem (x:: Float32 , y:: Float32 , :: RoundingMode{:Nearest} ) =
254
+ ccall ((:remainderf , libm),Float32,(Float32,Float32),x,y)
255
+
250
256
modf (x) = rem (x,one (x)), trunc (x)
251
257
252
258
const _modff_temp = Float32[0 ]
@@ -324,6 +330,35 @@ const pi3o2_l = 1.8369701987210297e-16 # convert(Float64, pi * BigFloat(3/2) -
324
330
const pi4o2_h = 6.283185307179586 # convert(Float64, pi * BigFloat(2))
325
331
const pi4o2_l = 2.4492935982947064e-16 # convert(Float64, pi * BigFloat(2) - pi4o2_h)
326
332
333
+ function rem2pi (x:: Float64 , :: RoundingMode{:Nearest} )
334
+ abs (x) < pi && return x
335
+
336
+ (n,y) = ieee754_rem_pio2 (x)
337
+
338
+ if iseven (n)
339
+ if n& 2 == 2 # add pi
340
+ return add22condh (y[1 ],y[2 ],pi2o2_h,pi2o2_l)
341
+ else # add 0
342
+ return y[1 ]
343
+ end
344
+ else
345
+ if n& 2 == 2 # subtract pi/2
346
+ return add22condh (y[1 ],y[2 ],- pi1o2_h,- pi1o2_l)
347
+ else # add pi/2
348
+ return add22condh (y[1 ],y[2 ],pi1o2_h,pi1o2_l)
349
+ end
350
+ end
351
+ end
352
+
353
+ rem2pi (x:: Float32 , :: RoundingMode{:Nearest} ) = Float32 (rem2pi (Float64 (x),RoundNearest))
354
+ rem2pi (x:: Int32 , :: RoundingMode{:Nearest} ) = rem2pi (Float64 (x),RoundNearest)
355
+ function rem2pi (x:: Int64 , :: RoundingMode{:Nearest} )
356
+ fx = Float64 (x)
357
+ fx == x || throw (ArgumentError (" Int64 argument to rem2pi is too large: $x " ))
358
+ rem2pi (fx,RoundNearest)
359
+ end
360
+
361
+
327
362
function mod2pi (x:: Float64 ) # or modtau(x)
328
363
# with r = mod2pi(x)
329
364
# a) 0 <= r < 2π (note: boundary open or closed - a bit fuzzy, due to rem_pio2 implementation)
0 commit comments