@@ -39,6 +39,19 @@ mag_close(const mag_t am, const mag_t bm)
3939 return res1 && res2 ;
4040}
4141
42+ int
43+ arb_equal_mid_close_mag (const arb_t a , const arb_t b )
44+ {
45+ return arf_equal (arb_midref (a ), arb_midref (b )) &&
46+ (mag_close (arb_radref (a ), arb_radref (b )) ||
47+ /* If a's and b's centres are infinite but their radii are finite, the radii don't need
48+ to be close: they represent signed infinity regardless. If their centres are NaN,
49+ then we should ignore their radii. */
50+ (arf_is_inf (arb_midref (a )) && arf_is_inf (arb_midref (b )) &&
51+ mag_is_finite (arb_radref (a )) && mag_is_finite (arb_radref (b ))) ||
52+ (arf_is_nan (arb_midref (a )) && arf_is_nan (arb_midref (b ))));
53+ }
54+
4255void
4356arb_addmul_naive (arb_t z , const arb_t x , const arb_t y , slong prec )
4457{
@@ -214,8 +227,7 @@ int main()
214227 arb_addmul (z , x , y , prec );
215228 arb_addmul_naive (v , x , y , prec );
216229
217- if (!arf_equal (arb_midref (z ), arb_midref (v ))
218- || !mag_close (arb_radref (z ), arb_radref (v )))
230+ if (!arb_equal_mid_close_mag (z , v ))
219231 {
220232 flint_printf ("FAIL!\n" );
221233 flint_printf ("x = " ); arb_print (x ); flint_printf ("\n\n" );
@@ -232,8 +244,7 @@ int main()
232244 arb_addmul (z , x , y , prec );
233245 arb_addmul (v , x , x , prec );
234246
235- if (!arf_equal (arb_midref (z ), arb_midref (v ))
236- || !mag_close (arb_radref (z ), arb_radref (v )))
247+ if (!arb_equal_mid_close_mag (z , v ))
237248 {
238249 flint_printf ("FAIL (aliasing 1)!\n" );
239250 flint_printf ("x = " ); arb_print (x ); flint_printf ("\n\n" );
@@ -248,8 +259,7 @@ int main()
248259 arb_addmul (v , x , x , prec );
249260 arb_addmul (x , x , x , prec );
250261
251- if (!arf_equal (arb_midref (x ), arb_midref (v ))
252- || !mag_close (arb_radref (x ), arb_radref (v )))
262+ if (!arb_equal_mid_close_mag (x , v ))
253263 {
254264 flint_printf ("FAIL (aliasing 2)!\n" );
255265 flint_printf ("x = " ); arb_print (x ); flint_printf ("\n\n" );
@@ -263,8 +273,7 @@ int main()
263273 arb_addmul (v , x , y , prec );
264274 arb_addmul (x , x , y , prec );
265275
266- if (!arf_equal (arb_midref (x ), arb_midref (v ))
267- || !mag_close (arb_radref (x ), arb_radref (v )))
276+ if (!arb_equal_mid_close_mag (x , v ))
268277 {
269278 flint_printf ("FAIL (aliasing 3)!\n" );
270279 flint_printf ("x = " ); arb_print (x ); flint_printf ("\n\n" );
@@ -279,8 +288,7 @@ int main()
279288 arb_addmul (v , x , y , prec );
280289 arb_addmul (x , y , x , prec );
281290
282- if (!arf_equal (arb_midref (x ), arb_midref (v ))
283- || !mag_close (arb_radref (x ), arb_radref (v )))
291+ if (!arb_equal_mid_close_mag (x , v ))
284292 {
285293 flint_printf ("FAIL (aliasing 4)!\n" );
286294 flint_printf ("x = " ); arb_print (x ); flint_printf ("\n\n" );
0 commit comments