Skip to content

Commit 6ac6203

Browse files
committed
[GR-10427][GR-10449] Math.pow and Math.atan2 are not fully implemented.
PullRequest: graalpython/84
2 parents 55293b9 + 4745ac6 commit 6ac6203

File tree

2 files changed

+391
-7
lines changed

2 files changed

+391
-7
lines changed

graalpython/com.oracle.graal.python.test/src/tests/test_math.py

Lines changed: 220 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)