@@ -32,37 +32,22 @@ fn redupif32(x: f32) f32 {
3232 t -= 0.5 ;
3333 }
3434
35- const u = @as ( f32 , @floatFromInt ( @as ( i32 , @intFromFloat ( t ))) );
36- return ((x - u * DP1 ) - u * DP2 ) - t * DP3 ;
35+ const u : f32 = @trunc ( t );
36+ return ((x - u * DP1 ) - u * DP2 ) - u * DP3 ;
3737}
3838
3939fn atan32 (z : Complex (f32 )) Complex (f32 ) {
40- const maxnum = 1.0e38 ;
41-
4240 const x = z .re ;
4341 const y = z .im ;
4442
45- if ((x == 0.0 ) and (y > 1.0 )) {
46- // overflow
47- return Complex (f32 ).init (maxnum , maxnum );
48- }
49-
5043 const x2 = x * x ;
5144 var a = 1.0 - x2 - (y * y );
52- if (a == 0.0 ) {
53- // overflow
54- return Complex (f32 ).init (maxnum , maxnum );
55- }
5645
5746 var t = 0.5 * math .atan2 (2.0 * x , a );
5847 const w = redupif32 (t );
5948
6049 t = y - 1.0 ;
6150 a = x2 + t * t ;
62- if (a == 0.0 ) {
63- // overflow
64- return Complex (f32 ).init (maxnum , maxnum );
65- }
6651
6752 t = y + 1.0 ;
6853 a = (x2 + (t * t )) / a ;
@@ -81,57 +66,42 @@ fn redupif64(x: f64) f64 {
8166 t -= 0.5 ;
8267 }
8368
84- const u = @as ( f64 , @floatFromInt ( @as ( i64 , @intFromFloat ( t ))) );
85- return ((x - u * DP1 ) - u * DP2 ) - t * DP3 ;
69+ const u : f64 = @trunc ( t );
70+ return ((x - u * DP1 ) - u * DP2 ) - u * DP3 ;
8671}
8772
8873fn atan64 (z : Complex (f64 )) Complex (f64 ) {
89- const maxnum = 1.0e308 ;
90-
9174 const x = z .re ;
9275 const y = z .im ;
9376
94- if ((x == 0.0 ) and (y > 1.0 )) {
95- // overflow
96- return Complex (f64 ).init (maxnum , maxnum );
97- }
98-
9977 const x2 = x * x ;
10078 var a = 1.0 - x2 - (y * y );
101- if (a == 0.0 ) {
102- // overflow
103- return Complex (f64 ).init (maxnum , maxnum );
104- }
10579
10680 var t = 0.5 * math .atan2 (2.0 * x , a );
10781 const w = redupif64 (t );
10882
10983 t = y - 1.0 ;
11084 a = x2 + t * t ;
111- if (a == 0.0 ) {
112- // overflow
113- return Complex (f64 ).init (maxnum , maxnum );
114- }
11585
11686 t = y + 1.0 ;
11787 a = (x2 + (t * t )) / a ;
11888 return Complex (f64 ).init (w , 0.25 * @log (a ));
11989}
12090
121- const epsilon = 0.0001 ;
122-
12391test atan32 {
92+ const epsilon = math .floatEps (f32 );
12493 const a = Complex (f32 ).init (5 , 3 );
12594 const c = atan (a );
12695
127- try testing .expect ( math . approxEqAbs ( f32 , c .re , 1.423679 , epsilon ) );
128- try testing .expect ( math . approxEqAbs ( f32 , c .im , 0.086569 , epsilon ) );
96+ try testing .expectApproxEqAbs ( 1.423679 , c .re , epsilon );
97+ try testing .expectApproxEqAbs ( 0.086569 , c .im , epsilon );
12998}
13099
131100test atan64 {
101+ const epsilon = math .floatEps (f64 );
132102 const a = Complex (f64 ).init (5 , 3 );
133103 const c = atan (a );
134104
135- try testing .expect ( math . approxEqAbs ( f64 , c .re , 1.423679 , epsilon ) );
136- try testing .expect ( math . approxEqAbs ( f64 , c .im , 0.086569 , epsilon ) );
105+ try testing .expectApproxEqAbs ( 1.4236790442393028 , c .re , epsilon );
106+ try testing .expectApproxEqAbs ( 0.08656905917945844 , c .im , epsilon );
137107}
0 commit comments