|
1 | 1 | # Tests various constants of the math module.
|
| 2 | + |
| 3 | +import sys |
| 4 | + |
2 | 5 | try:
|
3 |
| - import math |
4 |
| - from math import exp, cos |
| 6 | + from array import array |
| 7 | + from math import e, pi |
5 | 8 | except ImportError:
|
6 | 9 | print("SKIP")
|
7 | 10 | raise SystemExit
|
8 | 11 |
|
9 |
| -print(math.e == exp(1.0)) |
| 12 | +# Hexadecimal representations of e and pi constants. |
| 13 | +e_truth_single = 0x402DF854 |
| 14 | +pi_truth_single = 0x40490FDB |
| 15 | +e_truth_double = 0x4005BF0A8B145769 |
| 16 | +pi_truth_double = 0x400921FB54442D18 |
| 17 | + |
| 18 | +# Detect the floating-point precision of the system, to determine the exact values of |
| 19 | +# the constants (parsing the float from a decimal string can lead to inaccuracies). |
| 20 | +if float("1e300") == float("inf"): |
| 21 | + # Single precision floats. |
| 22 | + e_truth = array("f", e_truth_single.to_bytes(4, sys.byteorder))[0] |
| 23 | + pi_truth = array("f", pi_truth_single.to_bytes(4, sys.byteorder))[0] |
| 24 | +else: |
| 25 | + # Double precision floats. |
| 26 | + e_truth = array("d", e_truth_double.to_bytes(8, sys.byteorder))[0] |
| 27 | + pi_truth = array("d", pi_truth_double.to_bytes(8, sys.byteorder))[0] |
10 | 28 |
|
11 |
| -print(cos(math.pi)) |
| 29 | +print("e:", e == e_truth or (e, e_truth, e - e_truth)) |
| 30 | +print("pi:", pi == pi_truth or (pi, pi_truth, pi - pi_truth)) |
0 commit comments