@@ -578,15 +578,14 @@ end
578
578
@generated function besselkx_levin (v, x:: T , :: Val{N} ) where {T <: FloatTypes , N}
579
579
:(
580
580
begin
581
- l = let (out, term, fv2) = ( one ( typeof (x)), one ( typeof (x)), 4 * v ^ 2 )
582
- @ntuple $ N i -> begin
583
- offset = muladd ( 2 , i, - 1 )
584
- term *= muladd (offset, - offset, fv2) / ( 8 * x * i)
585
- out += term
586
- invterm = inv (term )
587
- Vec {2, T} ((out * invterm, invterm))
581
+ s = zero (T )
582
+ t = one (T)
583
+ l = @ntuple $ N i -> begin
584
+ s += t
585
+ t *= ( 4 * v ^ 2 - ( 2 i - 1 ) ^ 2 ) / ( 8 * x * i)
586
+ invterm = inv (t )
587
+ Vec {2, T} ((s * invterm, invterm))
588
588
end
589
- end
590
589
return levin_transform (l) * sqrt (π / 2 x)
591
590
end
592
591
)
@@ -595,16 +594,20 @@ end
595
594
@generated function besselkx_levin (v, x:: Complex{T} , :: Val{N} ) where {T <: FloatTypes , N}
596
595
:(
597
596
begin
598
- l = let (out, term, fv2, invx) = (one (typeof (x)), one (typeof (x)), 4 * v^ 2 , inv (8 * x))
599
- @ntuple $ N i -> begin
600
- offset = muladd (2 , i, - 1 )
601
- term *= @fastmath muladd (offset, - offset, fv2) * invx / i
602
- out += term
603
- invterm = @fastmath inv (term)
604
- Vec {4, T} ((reim (out * invterm)... , reim (invterm)... ))
597
+ s = zero (T)
598
+ t = one (typeof (x))
599
+ t2 = t
600
+ a = @fastmath inv (8 * x)
601
+ a2 = 8 * x
602
+
603
+ l = @ntuple $ N i -> begin
604
+ s += t
605
+ b = (4 * v^ 2 - (2 i - 1 )^ 2 ) / i
606
+ t *= a * b
607
+ t2 *= a2 / b
608
+ Vec {4, T} ((reim (s * t2)... , reim (t2)... ))
605
609
end
606
- end
607
610
return levin_transform (l) * sqrt (π / 2 x)
608
611
end
609
612
)
610
- end
613
+ end
0 commit comments