@@ -423,6 +423,226 @@ def test_isnan(self):
423423 self .assertFalse (math .isnan (False ))
424424 self .assertFalse (math .isnan (MyFloat ()))
425425
426+ def testPow (self ):
427+ self .assertRaises (TypeError , math .pow )
428+ self .ftest ('pow(0,1)' , math .pow (0 ,1 ), 0 )
429+ self .ftest ('pow(1,0)' , math .pow (1 ,0 ), 1 )
430+ self .ftest ('pow(2,1)' , math .pow (2 ,1 ), 2 )
431+ self .ftest ('pow(2,-1)' , math .pow (2 ,- 1 ), 0.5 )
432+ self .assertEqual (math .pow (INF , 1 ), INF )
433+ self .assertEqual (math .pow (NINF , 1 ), NINF )
434+ self .assertEqual ((math .pow (1 , INF )), 1. )
435+ self .assertEqual ((math .pow (1 , NINF )), 1. )
436+ self .assertTrue (math .isnan (math .pow (NAN , 1 )))
437+ self .assertTrue (math .isnan (math .pow (2 , NAN )))
438+ self .assertTrue (math .isnan (math .pow (0 , NAN )))
439+ self .assertEqual (math .pow (1 , NAN ), 1 )
440+
441+ # pow(0., x)
442+ self .assertEqual (math .pow (0. , INF ), 0. )
443+ self .assertEqual (math .pow (0. , 3. ), 0. )
444+ self .assertEqual (math .pow (0. , 2.3 ), 0. )
445+ self .assertEqual (math .pow (0. , 2. ), 0. )
446+ self .assertEqual (math .pow (0. , 0. ), 1. )
447+ self .assertEqual (math .pow (0. , - 0. ), 1. )
448+ self .assertRaises (ValueError , math .pow , 0. , - 2. )
449+ self .assertRaises (ValueError , math .pow , 0. , - 2.3 )
450+ self .assertRaises (ValueError , math .pow , 0. , - 3. )
451+ self .assertRaises (ValueError , math .pow , 0. , NINF )
452+ self .assertTrue (math .isnan (math .pow (0. , NAN )))
453+
454+ # pow(INF, x)
455+ self .assertEqual (math .pow (INF , INF ), INF )
456+ self .assertEqual (math .pow (INF , 3. ), INF )
457+ self .assertEqual (math .pow (INF , 2.3 ), INF )
458+ self .assertEqual (math .pow (INF , 2. ), INF )
459+ self .assertEqual (math .pow (INF , 0. ), 1. )
460+ self .assertEqual (math .pow (INF , - 0. ), 1. )
461+ self .assertEqual (math .pow (INF , - 2. ), 0. )
462+ self .assertEqual (math .pow (INF , - 2.3 ), 0. )
463+ self .assertEqual (math .pow (INF , - 3. ), 0. )
464+ self .assertEqual (math .pow (INF , NINF ), 0. )
465+ self .assertTrue (math .isnan (math .pow (INF , NAN )))
466+
467+ # pow(-0., x)
468+ self .assertEqual (math .pow (- 0. , INF ), 0. )
469+ self .assertEqual (math .pow (- 0. , 3. ), - 0. )
470+ self .assertEqual (math .pow (- 0. , 2.3 ), 0. )
471+ self .assertEqual (math .pow (- 0. , 2. ), 0. )
472+ self .assertEqual (math .pow (- 0. , 0. ), 1. )
473+ self .assertEqual (math .pow (- 0. , - 0. ), 1. )
474+ self .assertRaises (ValueError , math .pow , - 0. , - 2. )
475+ self .assertRaises (ValueError , math .pow , - 0. , - 2.3 )
476+ self .assertRaises (ValueError , math .pow , - 0. , - 3. )
477+ self .assertRaises (ValueError , math .pow , - 0. , NINF )
478+ self .assertTrue (math .isnan (math .pow (- 0. , NAN )))
479+
480+ # pow(NINF, x)
481+ self .assertEqual (math .pow (NINF , INF ), INF )
482+ self .assertEqual (math .pow (NINF , 3. ), NINF )
483+ self .assertEqual (math .pow (NINF , 2.3 ), INF )
484+ self .assertEqual (math .pow (NINF , 2. ), INF )
485+ self .assertEqual (math .pow (NINF , 0. ), 1. )
486+ self .assertEqual (math .pow (NINF , - 0. ), 1. )
487+ self .assertEqual (math .pow (NINF , - 2. ), 0. )
488+ self .assertEqual (math .pow (NINF , - 2.3 ), 0. )
489+ self .assertEqual (math .pow (NINF , - 3. ), - 0. )
490+ self .assertEqual (math .pow (NINF , NINF ), 0. )
491+ self .assertTrue (math .isnan (math .pow (NINF , NAN )))
492+
493+ # pow(-1, x)
494+ self .assertEqual (math .pow (- 1. , INF ), 1. )
495+ self .assertEqual (math .pow (- 1. , 3. ), - 1. )
496+ self .assertRaises (ValueError , math .pow , - 1. , 2.3 )
497+ self .assertEqual (math .pow (- 1. , 2. ), 1. )
498+ self .assertEqual (math .pow (- 1. , 0. ), 1. )
499+ self .assertEqual (math .pow (- 1. , - 0. ), 1. )
500+ self .assertEqual (math .pow (- 1. , - 2. ), 1. )
501+ self .assertRaises (ValueError , math .pow , - 1. , - 2.3 )
502+ self .assertEqual (math .pow (- 1. , - 3. ), - 1. )
503+ self .assertEqual (math .pow (- 1. , NINF ), 1. )
504+ self .assertTrue (math .isnan (math .pow (- 1. , NAN )))
505+
506+ # pow(1, x)
507+ self .assertEqual (math .pow (1. , INF ), 1. )
508+ self .assertEqual (math .pow (1. , 3. ), 1. )
509+ self .assertEqual (math .pow (1. , 2.3 ), 1. )
510+ self .assertEqual (math .pow (1. , 2. ), 1. )
511+ self .assertEqual (math .pow (1. , 0. ), 1. )
512+ self .assertEqual (math .pow (1. , - 0. ), 1. )
513+ self .assertEqual (math .pow (1. , - 2. ), 1. )
514+ self .assertEqual (math .pow (1. , - 2.3 ), 1. )
515+ self .assertEqual (math .pow (1. , - 3. ), 1. )
516+ self .assertEqual (math .pow (1. , NINF ), 1. )
517+ self .assertEqual (math .pow (1. , NAN ), 1. )
518+
519+ # pow(x, 0) should be 1 for any x
520+ self .assertEqual (math .pow (2.3 , 0. ), 1. )
521+ self .assertEqual (math .pow (- 2.3 , 0. ), 1. )
522+ self .assertEqual (math .pow (NAN , 0. ), 1. )
523+ self .assertEqual (math .pow (2.3 , - 0. ), 1. )
524+ self .assertEqual (math .pow (- 2.3 , - 0. ), 1. )
525+ self .assertEqual (math .pow (NAN , - 0. ), 1. )
526+
527+ # pow(x, y) is invalid if x is negative and y is not integral
528+ self .assertRaises (ValueError , math .pow , - 1. , 2.3 )
529+ self .assertRaises (ValueError , math .pow , - 15. , - 3.1 )
530+
531+ # pow(x, NINF)
532+ self .assertEqual (math .pow (1.9 , NINF ), 0. )
533+ self .assertEqual (math .pow (1.1 , NINF ), 0. )
534+ self .assertEqual (math .pow (0.9 , NINF ), INF )
535+ self .assertEqual (math .pow (0.1 , NINF ), INF )
536+ self .assertEqual (math .pow (- 0.1 , NINF ), INF )
537+ self .assertEqual (math .pow (- 0.9 , NINF ), INF )
538+ self .assertEqual (math .pow (- 1.1 , NINF ), 0. )
539+ self .assertEqual (math .pow (- 1.9 , NINF ), 0. )
540+
541+ # pow(x, INF)
542+ self .assertEqual (math .pow (1.9 , INF ), INF )
543+ self .assertEqual (math .pow (1.1 , INF ), INF )
544+ self .assertEqual (math .pow (0.9 , INF ), 0. )
545+ self .assertEqual (math .pow (0.1 , INF ), 0. )
546+ self .assertEqual (math .pow (- 0.1 , INF ), 0. )
547+ self .assertEqual (math .pow (- 0.9 , INF ), 0. )
548+ self .assertEqual (math .pow (- 1.1 , INF ), INF )
549+ self .assertEqual (math .pow (- 1.9 , INF ), INF )
550+
551+ # pow(x, y) should work for x negative, y an integer
552+ self .ftest ('(-2.)**3.' , math .pow (- 2.0 , 3.0 ), - 8.0 )
553+ self .ftest ('(-2.)**2.' , math .pow (- 2.0 , 2.0 ), 4.0 )
554+ self .ftest ('(-2.)**1.' , math .pow (- 2.0 , 1.0 ), - 2.0 )
555+ self .ftest ('(-2.)**0.' , math .pow (- 2.0 , 0.0 ), 1.0 )
556+ self .ftest ('(-2.)**-0.' , math .pow (- 2.0 , - 0.0 ), 1.0 )
557+ self .ftest ('(-2.)**-1.' , math .pow (- 2.0 , - 1.0 ), - 0.5 )
558+ self .ftest ('(-2.)**-2.' , math .pow (- 2.0 , - 2.0 ), 0.25 )
559+ self .ftest ('(-2.)**-3.' , math .pow (- 2.0 , - 3.0 ), - 0.125 )
560+ self .assertRaises (ValueError , math .pow , - 2.0 , - 0.5 )
561+ self .assertRaises (ValueError , math .pow , - 2.0 , 0.5 )
562+
563+ self .assertRaises (OverflowError , math .pow , 999999999999999999999999999 , 999999999999999999999999999 )
564+
565+ # testing specializations
566+ self .assertEqual (math .pow (0 , 999999999999999999999999999 ), 0 )
567+ self .assertEqual (math .pow (999999999999999999999999999 , 0 ), 1 )
568+ self .assertEqual (math .pow (0.0 , 999999999999999999999999999 ), 0 )
569+ self .assertEqual (math .pow (999999999999999999999999999 , 0.0 ), 1 )
570+
571+ class MyNumber ():
572+ def __float__ (self ):
573+ return - 2. ;
574+ self .ftest ('MyFloat()**-3.' , math .pow (MyNumber (), - 3.0 ), - 0.125 )
575+
576+ def testAtan2 (self ):
577+ self .assertRaises (TypeError , math .atan2 )
578+ self .ftest ('atan2(-1, 0)' , math .atan2 (- 1 , 0 ), - math .pi / 2 )
579+ self .ftest ('atan2(-1, 1)' , math .atan2 (- 1 , 1 ), - math .pi / 4 )
580+ self .ftest ('atan2(0, 1)' , math .atan2 (0 , 1 ), 0 )
581+ self .ftest ('atan2(1, 1)' , math .atan2 (1 , 1 ), math .pi / 4 )
582+ self .ftest ('atan2(1, 0)' , math .atan2 (1 , 0 ), math .pi / 2 )
583+
584+ # math.atan2(0, x)
585+ self .ftest ('atan2(0., -inf)' , math .atan2 (0. , NINF ), math .pi )
586+ self .ftest ('atan2(0., -2.3)' , math .atan2 (0. , - 2.3 ), math .pi )
587+ self .ftest ('atan2(0., -0.)' , math .atan2 (0. , - 0. ), math .pi )
588+ self .assertEqual (math .atan2 (0. , 0. ), 0. )
589+ self .assertEqual (math .atan2 (0. , 2.3 ), 0. )
590+ self .assertEqual (math .atan2 (0. , INF ), 0. )
591+ self .assertTrue (math .isnan (math .atan2 (0. , NAN )))
592+ # math.atan2(-0, x)
593+ self .ftest ('atan2(-0., -inf)' , math .atan2 (- 0. , NINF ), - math .pi )
594+ self .ftest ('atan2(-0., -2.3)' , math .atan2 (- 0. , - 2.3 ), - math .pi )
595+ self .ftest ('atan2(-0., -0.)' , math .atan2 (- 0. , - 0. ), - math .pi )
596+ self .assertEqual (math .atan2 (- 0. , 0. ), - 0. )
597+ self .assertEqual (math .atan2 (- 0. , 2.3 ), - 0. )
598+ self .assertEqual (math .atan2 (- 0. , INF ), - 0. )
599+ self .assertTrue (math .isnan (math .atan2 (- 0. , NAN )))
600+ # math.atan2(INF, x)
601+ self .ftest ('atan2(inf, -inf)' , math .atan2 (INF , NINF ), math .pi * 3 / 4 )
602+ self .ftest ('atan2(inf, -2.3)' , math .atan2 (INF , - 2.3 ), math .pi / 2 )
603+ self .ftest ('atan2(inf, -0.)' , math .atan2 (INF , - 0.0 ), math .pi / 2 )
604+ self .ftest ('atan2(inf, 0.)' , math .atan2 (INF , 0.0 ), math .pi / 2 )
605+ self .ftest ('atan2(inf, 2.3)' , math .atan2 (INF , 2.3 ), math .pi / 2 )
606+ self .ftest ('atan2(inf, inf)' , math .atan2 (INF , INF ), math .pi / 4 )
607+ self .assertTrue (math .isnan (math .atan2 (INF , NAN )))
608+ # math.atan2(NINF, x)
609+ self .ftest ('atan2(-inf, -inf)' , math .atan2 (NINF , NINF ), - math .pi * 3 / 4 )
610+ self .ftest ('atan2(-inf, -2.3)' , math .atan2 (NINF , - 2.3 ), - math .pi / 2 )
611+ self .ftest ('atan2(-inf, -0.)' , math .atan2 (NINF , - 0.0 ), - math .pi / 2 )
612+ self .ftest ('atan2(-inf, 0.)' , math .atan2 (NINF , 0.0 ), - math .pi / 2 )
613+ self .ftest ('atan2(-inf, 2.3)' , math .atan2 (NINF , 2.3 ), - math .pi / 2 )
614+ self .ftest ('atan2(-inf, inf)' , math .atan2 (NINF , INF ), - math .pi / 4 )
615+ self .assertTrue (math .isnan (math .atan2 (NINF , NAN )))
616+ # math.atan2(+finite, x)
617+ self .ftest ('atan2(2.3, -inf)' , math .atan2 (2.3 , NINF ), math .pi )
618+ self .ftest ('atan2(2.3, -0.)' , math .atan2 (2.3 , - 0. ), math .pi / 2 )
619+ self .ftest ('atan2(2.3, 0.)' , math .atan2 (2.3 , 0. ), math .pi / 2 )
620+ self .assertEqual (math .atan2 (2.3 , INF ), 0. )
621+ self .assertTrue (math .isnan (math .atan2 (2.3 , NAN )))
622+ # math.atan2(-finite, x)
623+ self .ftest ('atan2(-2.3, -inf)' , math .atan2 (- 2.3 , NINF ), - math .pi )
624+ self .ftest ('atan2(-2.3, -0.)' , math .atan2 (- 2.3 , - 0. ), - math .pi / 2 )
625+ self .ftest ('atan2(-2.3, 0.)' , math .atan2 (- 2.3 , 0. ), - math .pi / 2 )
626+ self .assertEqual (math .atan2 (- 2.3 , INF ), - 0. )
627+ self .assertTrue (math .isnan (math .atan2 (- 2.3 , NAN )))
628+ # math.atan2(NAN, x)
629+ self .assertTrue (math .isnan (math .atan2 (NAN , NINF )))
630+ self .assertTrue (math .isnan (math .atan2 (NAN , - 2.3 )))
631+ self .assertTrue (math .isnan (math .atan2 (NAN , - 0. )))
632+ self .assertTrue (math .isnan (math .atan2 (NAN , 0. )))
633+ self .assertTrue (math .isnan (math .atan2 (NAN , 2.3 )))
634+ self .assertTrue (math .isnan (math .atan2 (NAN , INF )))
635+ self .assertTrue (math .isnan (math .atan2 (NAN , NAN )))
636+
637+ # Testing specializations
638+ self .ftest ('atan2(0.5,1)' , math .atan2 (0.5 ,1 ), 0.4636476090008061 )
639+ self .ftest ('atan2(1,0.5)' , math .atan2 (1 ,0.5 ), 1.1071487177940904 )
640+ self .ftest ('atan2(BIG_INT,BIG_INT)' , math .atan2 (BIG_INT ,BIG_INT ), 0.7853981633974483 )
641+ self .ftest ('atan2(BIG_INT,1)' , math .atan2 (BIG_INT ,1 ), 1.5707963267948966 )
642+ self .ftest ('atan2(BIG_INT,0.1)' , math .atan2 (BIG_INT ,0.1 ), 1.5707963267948966 )
643+ self .ftest ('atan2(MyFloat(),MyFloat())' , math .atan2 (MyFloat (),MyFloat ()), 0.7853981633974483 )
644+ self .ftest ('atan2(BIG_INT,MyFloat())' , math .atan2 (BIG_INT ,MyFloat ()), 1.5707963267948966 )
645+
426646 def test_fabs (self ):
427647 self .assertEqual (math .fabs (- 1 ), 1 )
428648 self .assertEqual (math .fabs (0 ), 0 )
0 commit comments