mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 05:31:20 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			42 lines
		
	
	
	
		
			1 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			42 lines
		
	
	
	
		
			1 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| #
 | |
| # These tests require gmpy and test the limits of the 32-bit build. The
 | |
| # limits of the 64-bit build are so large that they cannot be tested
 | |
| # on accessible hardware.
 | |
| #
 | |
| 
 | |
| import sys
 | |
| from decimal import *
 | |
| from gmpy import mpz
 | |
| 
 | |
| 
 | |
| _PyHASH_MODULUS = sys.hash_info.modulus
 | |
| # hash values to use for positive and negative infinities, and nans
 | |
| _PyHASH_INF = sys.hash_info.inf
 | |
| _PyHASH_NAN = sys.hash_info.nan
 | |
| 
 | |
| # _PyHASH_10INV is the inverse of 10 modulo the prime _PyHASH_MODULUS
 | |
| _PyHASH_10INV = pow(10, _PyHASH_MODULUS - 2, _PyHASH_MODULUS)
 | |
| 
 | |
| def xhash(coeff, exp):
 | |
|     sign = 1
 | |
|     if coeff < 0:
 | |
|         sign = -1
 | |
|         coeff = -coeff
 | |
|     if exp >= 0:
 | |
|         exp_hash = pow(10, exp, _PyHASH_MODULUS)
 | |
|     else:
 | |
|         exp_hash = pow(_PyHASH_10INV, -exp, _PyHASH_MODULUS)
 | |
|     hash_ = coeff * exp_hash % _PyHASH_MODULUS
 | |
|     ans = hash_ if sign == 1 else -hash_
 | |
|     return -2 if ans == -1 else ans
 | |
| 
 | |
| 
 | |
| x = mpz(10) ** 425000000 - 1
 | |
| coeff = int(x)
 | |
| 
 | |
| d = Decimal('9' * 425000000 + 'e-849999999')
 | |
| 
 | |
| h1 = xhash(coeff, -849999999)
 | |
| h2 = hash(d)
 | |
| 
 | |
| assert h2 == h1
 | 
