@@ -19,6 +19,7 @@ has_fma = Dict(
1919 Rational{Int} => has_fma_Int (),
2020 Float32 => has_fma_Float32 (),
2121 Float64 => has_fma_Float64 (),
22+ BigFloat => true ,
2223)
2324
2425@testset " clamp" begin
@@ -424,47 +425,51 @@ end
424425 @test rad2deg (pi + (pi / 3 )* im) ≈ 180 + 60im
425426end
426427
428+ # ensure zeros are signed the same
429+ ⩲ (x,y) = typeof (x) == typeof (y) && x == y && signbit (x) == signbit (y)
430+ ⩲ (x:: Tuple , y:: Tuple ) = length (x) == length (y) && all (map (⩲ ,x,y))
431+
427432@testset " degree-based trig functions" begin
428- @testset " $T " for T = (Float32,Float64,Rational{Int})
433+ @testset " $T " for T = (Float32,Float64,Rational{Int},BigFloat )
429434 fT = typeof (float (one (T)))
430435 fTsc = typeof ( (float (one (T)), float (one (T))) )
431436 for x = - 400 : 40 : 400
432- @test sind (convert (T,x)):: fT ≈ convert (fT, sin (pi / 180 * x) ) atol= eps (deg2rad (convert (fT,x)))
433- @test cosd (convert (T,x)):: fT ≈ convert (fT, cos (pi / 180 * x) ) atol= eps (deg2rad (convert (fT,x)))
437+ @test sind (convert (T,x)):: fT ≈ sin (pi * convert (fT,x) / 180 ) atol= eps (deg2rad (convert (fT,x)))
438+ @test cosd (convert (T,x)):: fT ≈ cos (pi * convert (fT,x) / 180 ) atol= eps (deg2rad (convert (fT,x)))
434439
435440 s,c = sincosd (convert (T,x))
436- @test s:: fT ≈ convert (fT, sin (pi / 180 * x) ) atol= eps (deg2rad (convert (fT,x)))
437- @test c:: fT ≈ convert (fT, cos (pi / 180 * x) ) atol= eps (deg2rad (convert (fT,x)))
441+ @test s:: fT ≈ sin (pi * convert (fT,x) / 180 ) atol= eps (deg2rad (convert (fT,x)))
442+ @test c:: fT ≈ cos (pi * convert (fT,x) / 180 ) atol= eps (deg2rad (convert (fT,x)))
438443 end
439444 @testset " sind" begin
440- @test sind (convert (T,0.0 )):: fT === zero (fT)
441- @test sind (convert (T,180.0 )):: fT === zero (fT)
442- @test sind (convert (T,360.0 )):: fT === zero (fT)
443- T != Rational{Int} && @test sind (convert (T,- 0.0 )):: fT === - zero (fT)
444- @test sind (convert (T,- 180.0 )):: fT === - zero (fT)
445- @test sind (convert (T,- 360.0 )):: fT === - zero (fT)
445+ @test sind (convert (T,0.0 )):: fT ⩲ zero (fT)
446+ @test sind (convert (T,180.0 )):: fT ⩲ zero (fT)
447+ @test sind (convert (T,360.0 )):: fT ⩲ zero (fT)
448+ T != Rational{Int} && @test sind (convert (T,- 0.0 )):: fT ⩲ - zero (fT)
449+ @test sind (convert (T,- 180.0 )):: fT ⩲ - zero (fT)
450+ @test sind (convert (T,- 360.0 )):: fT ⩲ - zero (fT)
446451 if T <: AbstractFloat
447452 @test isnan (sind (T (NaN )))
448453 end
449454 end
450455 @testset " cosd" begin
451- @test cosd (convert (T,90 )):: fT === zero (fT)
452- @test cosd (convert (T,270 )):: fT === zero (fT)
453- @test cosd (convert (T,- 90 )):: fT === zero (fT)
454- @test cosd (convert (T,- 270 )):: fT === zero (fT)
456+ @test cosd (convert (T,90 )):: fT ⩲ zero (fT)
457+ @test cosd (convert (T,270 )):: fT ⩲ zero (fT)
458+ @test cosd (convert (T,- 90 )):: fT ⩲ zero (fT)
459+ @test cosd (convert (T,- 270 )):: fT ⩲ zero (fT)
455460 if T <: AbstractFloat
456461 @test isnan (cosd (T (NaN )))
457462 end
458463 end
459464 @testset " sincosd" begin
460- @test sincosd (convert (T,- 360 )):: fTsc === ( - zero (fT), one (fT) )
461- @test sincosd (convert (T,- 270 )):: fTsc === ( one (fT), zero (fT) )
462- @test sincosd (convert (T,- 180 )):: fTsc === ( - zero (fT), - one (fT) )
463- @test sincosd (convert (T, - 90 )):: fTsc === ( - one (fT), zero (fT) )
464- @test sincosd (convert (T, 0 )):: fTsc === ( zero (fT), one (fT) )
465- @test sincosd (convert (T, 90 )):: fTsc === ( one (fT), zero (fT) )
466- @test sincosd (convert (T, 180 )):: fTsc === ( zero (fT), - one (fT) )
467- @test sincosd (convert (T, 270 )):: fTsc === ( - one (fT), zero (fT) )
465+ @test sincosd (convert (T,- 360 )):: fTsc ⩲ ( - zero (fT), one (fT) )
466+ @test sincosd (convert (T,- 270 )):: fTsc ⩲ ( one (fT), zero (fT) )
467+ @test sincosd (convert (T,- 180 )):: fTsc ⩲ ( - zero (fT), - one (fT) )
468+ @test sincosd (convert (T, - 90 )):: fTsc ⩲ ( - one (fT), zero (fT) )
469+ @test sincosd (convert (T, 0 )):: fTsc ⩲ ( zero (fT), one (fT) )
470+ @test sincosd (convert (T, 90 )):: fTsc ⩲ ( one (fT), zero (fT) )
471+ @test sincosd (convert (T, 180 )):: fTsc ⩲ ( zero (fT), - one (fT) )
472+ @test sincosd (convert (T, 270 )):: fTsc ⩲ ( - one (fT), zero (fT) )
468473 if T <: AbstractFloat
469474 @test_throws DomainError sincosd (T (Inf ))
470475 @test all (isnan .(sincosd (T (NaN ))))
@@ -476,22 +481,22 @@ end
476481 " sincospi" => (x-> sincospi (x)[1 ], x-> sincospi (x)[2 ])
477482 )
478483 @testset " pi * $x " for x = - 3 : 0.3 : 3
479- @test sinpi (convert (T,x)):: fT ≈ convert (fT, sin (pi * x)) atol= eps (pi * convert (fT,x))
480- @test cospi (convert (T,x)):: fT ≈ convert (fT, cos (pi * x)) atol= eps (pi * convert (fT,x))
484+ @test sinpi (convert (T,x)):: fT ≈ sin (pi * convert (fT, x)) atol= eps (pi * convert (fT,x))
485+ @test cospi (convert (T,x)):: fT ≈ cos (pi * convert (fT, x)) atol= eps (pi * convert (fT,x))
481486 end
482487
483- @test sinpi (convert (T,0.0 )):: fT === zero (fT)
484- @test sinpi (convert (T,1.0 )):: fT === zero (fT)
485- @test sinpi (convert (T,2.0 )):: fT === zero (fT)
486- T != Rational{Int} && @test sinpi (convert (T,- 0.0 )):: fT === - zero (fT)
487- @test sinpi (convert (T,- 1.0 )):: fT === - zero (fT)
488- @test sinpi (convert (T,- 2.0 )):: fT === - zero (fT)
488+ @test sinpi (convert (T,0.0 )):: fT ⩲ zero (fT)
489+ @test sinpi (convert (T,1.0 )):: fT ⩲ zero (fT)
490+ @test sinpi (convert (T,2.0 )):: fT ⩲ zero (fT)
491+ T != Rational{Int} && @test sinpi (convert (T,- 0.0 )):: fT ⩲ - zero (fT)
492+ @test sinpi (convert (T,- 1.0 )):: fT ⩲ - zero (fT)
493+ @test sinpi (convert (T,- 2.0 )):: fT ⩲ - zero (fT)
489494 @test_throws DomainError sinpi (convert (T,Inf ))
490495
491- @test cospi (convert (T,0.5 )):: fT === zero (fT)
492- @test cospi (convert (T,1.5 )):: fT === zero (fT)
493- @test cospi (convert (T,- 0.5 )):: fT === zero (fT)
494- @test cospi (convert (T,- 1.5 )):: fT === zero (fT)
496+ @test cospi (convert (T,0.5 )):: fT ⩲ zero (fT)
497+ @test cospi (convert (T,1.5 )):: fT ⩲ zero (fT)
498+ @test cospi (convert (T,- 0.5 )):: fT ⩲ zero (fT)
499+ @test cospi (convert (T,- 1.5 )):: fT ⩲ zero (fT)
495500 @test_throws DomainError cospi (convert (T,Inf ))
496501 end
497502 @testset begin
512517 @test my_eq (sincospi (one (T)/ convert (T,6 ))[1 ], 0.5 )
513518 @test_throws DomainError sind (convert (T,Inf ))
514519 @test_throws DomainError cosd (convert (T,Inf ))
515- T != Float32 && @test my_eq (cospi (one (T)/ convert (T,3 )), 0.5 )
516- T != Float32 && @test my_eq (sincospi (one (T)/ convert (T,3 ))[2 ], 0.5 )
520+ fT == Float64 && @test my_eq (cospi (one (T)/ convert (T,3 )), 0.5 )
521+ fT == Float64 && @test my_eq (sincospi (one (T)/ convert (T,3 ))[2 ], 0.5 )
517522 T == Rational{Int} && @test my_eq (sinpi (5 // 6 ), 0.5 )
518523 T == Rational{Int} && @test my_eq (sincospi (5 // 6 )[1 ], 0.5 )
519524 end
562567 end
563568 end
564569 end
565- @test @inferred (sinc (0 // 1 )) === 1.0
566- @test @inferred (cosc (0 // 1 )) === - 0.0
570+ @test @inferred (sinc (0 // 1 )) ⩲ 1.0
571+ @test @inferred (cosc (0 // 1 )) ⩲ - 0.0
567572
568573 # test right before/after thresholds of Taylor series
569574 @test sinc (0.001 ) ≈ 0.999998355066745 rtol= 1e-15
0 commit comments