@@ -1104,6 +1104,9 @@ Return a `T(NaN)` if `isnan(x)`.
1104
1104
See also [`sinc`](@ref).
1105
1105
"""
1106
1106
cosc (x:: Number ) = _cosc (float (x))
1107
+ function _cosc_generic (x)
1108
+ ((pi * x)* cospi (x)- sinpi (x))/ ((pi * x)* x)
1109
+ end
1107
1110
function _cosc (x:: Number )
1108
1111
# naive cosc formula is susceptible to catastrophic
1109
1112
# cancellation error near x=0, so we use the Taylor series
@@ -1123,17 +1126,17 @@ function _cosc(x::Number)
1123
1126
end
1124
1127
return π* s
1125
1128
else
1126
- return isinf_real (x) ? zero (x) : (( pi * x) * cospi (x) - sinpi (x)) / (( pi * x) * x)
1129
+ return isinf_real (x) ? zero (x) : _cosc_generic ( x)
1127
1130
end
1128
1131
end
1129
1132
# hard-code Float64/Float32 Taylor series, with coefficients
1130
1133
# Float64.([(-1)^n*big(pi)^(2n)/((2n+1)*factorial(2n-1)) for n = 1:6])
1131
1134
_cosc (x:: Union{Float64,ComplexF64} ) =
1132
1135
fastabs (x) < 0.14 ? x* evalpoly (x^ 2 , (- 3.289868133696453 , 3.2469697011334144 , - 1.1445109447325053 , 0.2091827825412384 , - 0.023460810354558236 , 0.001781145516372852 )) :
1133
- isinf_real (x) ? zero (x) : (( pi * x) * cospi (x) - sinpi (x)) / (( pi * x) * x)
1136
+ isinf_real (x) ? zero (x) : _cosc_generic ( x)
1134
1137
_cosc (x:: Union{Float32,ComplexF32} ) =
1135
1138
fastabs (x) < 0.26f0 ? x* evalpoly (x^ 2 , (- 3.289868f0 , 3.2469697f0 , - 1.144511f0 , 0.20918278f0 )) :
1136
- isinf_real (x) ? zero (x) : (( pi * x) * cospi (x) - sinpi (x)) / (( pi * x) * x)
1139
+ isinf_real (x) ? zero (x) : _cosc_generic ( x)
1137
1140
_cosc (x:: Float16 ) = Float16 (_cosc (Float32 (x)))
1138
1141
_cosc (x:: ComplexF16 ) = ComplexF16 (_cosc (ComplexF32 (x)))
1139
1142
0 commit comments