| 
									
										
										
										
											2001-09-04 06:17:36 +00:00
										 |  |  | from __future__ import division | 
					
						
							|  |  |  | # When true division is the default, get rid of this and add it to | 
					
						
							|  |  |  | # test_long.py instead.  In the meantime, it's too obscure to try to | 
					
						
							|  |  |  | # trick just part of test_long into using future division. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-07-23 19:04:11 +00:00
										 |  |  | from test.test_support import TestFailed, verify, verbose | 
					
						
							| 
									
										
										
										
											2001-09-04 06:17:36 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | def test_true_division(): | 
					
						
							|  |  |  |     if verbose: | 
					
						
							|  |  |  |         print "long true division" | 
					
						
							| 
									
										
										
										
											2007-01-15 16:59:06 +00:00
										 |  |  |     huge = 1 << 40000 | 
					
						
							| 
									
										
										
										
											2001-09-04 06:17:36 +00:00
										 |  |  |     mhuge = -huge | 
					
						
							|  |  |  |     verify(huge / huge == 1.0) | 
					
						
							|  |  |  |     verify(mhuge / mhuge == 1.0) | 
					
						
							|  |  |  |     verify(huge / mhuge == -1.0) | 
					
						
							|  |  |  |     verify(mhuge / huge == -1.0) | 
					
						
							|  |  |  |     verify(1 / huge == 0.0) | 
					
						
							| 
									
										
										
										
											2007-01-15 16:59:06 +00:00
										 |  |  |     verify(1 / huge == 0.0) | 
					
						
							|  |  |  |     verify(1 / mhuge == 0.0) | 
					
						
							| 
									
										
										
										
											2001-09-04 06:17:36 +00:00
										 |  |  |     verify(1 / mhuge == 0.0) | 
					
						
							|  |  |  |     verify((666 * huge + (huge >> 1)) / huge == 666.5) | 
					
						
							|  |  |  |     verify((666 * mhuge + (mhuge >> 1)) / mhuge == 666.5) | 
					
						
							|  |  |  |     verify((666 * huge + (huge >> 1)) / mhuge == -666.5) | 
					
						
							|  |  |  |     verify((666 * mhuge + (mhuge >> 1)) / huge == -666.5) | 
					
						
							|  |  |  |     verify(huge / (huge << 1) == 0.5) | 
					
						
							| 
									
										
										
										
											2001-09-04 06:33:00 +00:00
										 |  |  |     verify((1000000 * huge) / huge == 1000000) | 
					
						
							| 
									
										
										
										
											2001-09-04 06:17:36 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     namespace = {'huge': huge, 'mhuge': mhuge} | 
					
						
							| 
									
										
										
										
											2001-09-04 06:33:00 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-09-04 06:17:36 +00:00
										 |  |  |     for overflow in ["float(huge)", "float(mhuge)", | 
					
						
							| 
									
										
										
										
											2007-01-15 16:59:06 +00:00
										 |  |  |                      "huge / 1", "huge / 2", "huge / -1", "huge / -2", | 
					
						
							|  |  |  |                      "mhuge / 100", "mhuge / 100"]: | 
					
						
							| 
									
										
										
										
											2001-09-04 06:17:36 +00:00
										 |  |  |         try: | 
					
						
							|  |  |  |             eval(overflow, namespace) | 
					
						
							|  |  |  |         except OverflowError: | 
					
						
							|  |  |  |             pass | 
					
						
							|  |  |  |         else: | 
					
						
							|  |  |  |             raise TestFailed("expected OverflowError from %r" % overflow) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-01-15 16:59:06 +00:00
										 |  |  |     for underflow in ["1 / huge", "2 / huge", "-1 / huge", "-2 / huge", | 
					
						
							|  |  |  |                      "100 / mhuge", "100 / mhuge"]: | 
					
						
							| 
									
										
										
										
											2001-09-06 22:03:36 +00:00
										 |  |  |         result = eval(underflow, namespace) | 
					
						
							|  |  |  |         if result != 0.0: | 
					
						
							| 
									
										
										
										
											2001-09-07 00:47:00 +00:00
										 |  |  |             raise TestFailed("expected underflow to 0 from %r" % underflow) | 
					
						
							| 
									
										
										
										
											2001-09-06 22:03:36 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-01-15 16:59:06 +00:00
										 |  |  |     for zero in ["huge / 0", "huge / 0", | 
					
						
							|  |  |  |                  "mhuge / 0", "mhuge / 0"]: | 
					
						
							| 
									
										
										
										
											2001-09-04 06:33:00 +00:00
										 |  |  |         try: | 
					
						
							|  |  |  |             eval(zero, namespace) | 
					
						
							|  |  |  |         except ZeroDivisionError: | 
					
						
							|  |  |  |             pass | 
					
						
							|  |  |  |         else: | 
					
						
							|  |  |  |             raise TestFailed("expected ZeroDivisionError from %r" % zero) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-09-04 06:17:36 +00:00
										 |  |  | test_true_division() |