@@ -423,6 +423,157 @@ 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+
426577 def test_fabs (self ):
427578 self .assertEqual (math .fabs (- 1 ), 1 )
428579 self .assertEqual (math .fabs (0 ), 0 )
0 commit comments