Skip to content

Commit e2d4778

Browse files
committed
cleaned finfo tests
1 parent 7185807 commit e2d4778

File tree

1 file changed

+13
-55
lines changed

1 file changed

+13
-55
lines changed

quaddtype/tests/test_finfo.py

Lines changed: 13 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import pytest
22
import numpy as np
3+
from utils import assert_quad_equal as assert_quad_close
34
from numpy_quaddtype import QuadPrecDType, QuadPrecision
45

56

@@ -19,112 +20,69 @@ def test_basic_integer_properties(self):
1920
assert finfo.minexp == -16382, f"Expected minexp=-16382, got {finfo.minexp}"
2021
assert finfo.maxexp == 16384, f"Expected maxexp=16384, got {finfo.maxexp}"
2122
assert finfo.precision == 33, f"Expected precision=33 (decimal digits), got {finfo.precision}"
23+
assert finfo.machep == -112, f"Expected machep=-112, got {finfo.machep}"
24+
assert finfo.negep == -113, f"Expected negep=-113, got {finfo.negep}"
2225

2326
def test_epsilon_values(self):
2427
"""Test epsilon values (eps and epsneg)."""
2528
dtype = QuadPrecDType()
2629
finfo = np.finfo(dtype)
2730

2831
# eps = 2^-112 (difference between 1.0 and next larger representable float)
29-
expected_eps = QuadPrecision("1.92592994438723585305597794258492732e-34")
3032
assert isinstance(finfo.eps, QuadPrecision), f"eps should be QuadPrecision, got {type(finfo.eps)}"
31-
assert str(finfo.eps) == str(expected_eps), f"eps: expected {expected_eps}, got {finfo.eps}"
33+
assert_quad_close(finfo.eps, "1.925929944387235853055977942584927e-034")
3234

3335
# epsneg = 2^-113 (difference between 1.0 and next smaller representable float)
34-
expected_epsneg = QuadPrecision("9.62964972193617926527988971292463660e-35")
3536
assert isinstance(finfo.epsneg, QuadPrecision), f"epsneg should be QuadPrecision, got {type(finfo.epsneg)}"
36-
assert str(finfo.epsneg) == str(expected_epsneg), f"epsneg: expected {expected_epsneg}, got {finfo.epsneg}"
37+
assert_quad_close(finfo.epsneg, "9.629649721936179265279889712924637e-035")
3738

3839
def test_max_and_min_values(self):
3940
"""Test maximum and minimum finite values."""
4041
dtype = QuadPrecDType()
4142
finfo = np.finfo(dtype)
4243

4344
# max = SLEEF_QUAD_MAX
44-
expected_max = QuadPrecision("1.18973149535723176508575932662800702e+4932")
4545
assert isinstance(finfo.max, QuadPrecision), f"max should be QuadPrecision, got {type(finfo.max)}"
46-
assert str(finfo.max) == str(expected_max), f"max: expected {expected_max}, got {finfo.max}"
46+
assert_quad_close(finfo.max, "1.189731495357231765085759326628007e+4932")
4747

4848
# min = -SLEEF_QUAD_MAX (most negative finite value)
49-
expected_min = QuadPrecision("-1.18973149535723176508575932662800702e+4932")
5049
assert isinstance(finfo.min, QuadPrecision), f"min should be QuadPrecision, got {type(finfo.min)}"
51-
assert str(finfo.min) == str(expected_min), f"min: expected {expected_min}, got {finfo.min}"
50+
assert_quad_close(finfo.min, "-1.189731495357231765085759326628007e+4932")
5251

5352
# Verify min is negative
54-
assert str(finfo.min).startswith('-'), f"min should be negative, got {finfo.min}"
53+
zero = QuadPrecision("0")
54+
assert finfo.min < zero, f"min should be negative, got {finfo.min}"
5555

5656
def test_tiny_and_smallest_values(self):
5757
"""Test tiny (smallest_normal) and smallest_subnormal values."""
5858
dtype = QuadPrecDType()
5959
finfo = np.finfo(dtype)
6060

6161
# tiny = smallest_normal = SLEEF_QUAD_MIN = 2^-16382
62-
expected_tiny = QuadPrecision("3.36210314311209350626267781732175260e-4932")
6362
assert isinstance(finfo.tiny, QuadPrecision), f"tiny should be QuadPrecision, got {type(finfo.tiny)}"
6463
assert isinstance(finfo.smallest_normal, QuadPrecision), \
6564
f"smallest_normal should be QuadPrecision, got {type(finfo.smallest_normal)}"
6665

6766
# tiny and smallest_normal should be the same
68-
assert str(finfo.tiny) == str(finfo.smallest_normal), \
67+
assert finfo.tiny == finfo.smallest_normal, \
6968
f"tiny and smallest_normal should be equal, got {finfo.tiny} != {finfo.smallest_normal}"
70-
assert str(finfo.tiny) == str(expected_tiny), f"tiny: expected {expected_tiny}, got {finfo.tiny}"
69+
assert_quad_close(finfo.tiny, "3.362103143112093506262677817321753e-4932")
7170

7271
# smallest_subnormal = 2^-16494 (smallest positive representable number)
73-
expected_smallest_subnormal = QuadPrecision("6.47517511943802511092443895822764655e-4966")
7472
assert isinstance(finfo.smallest_subnormal, QuadPrecision), \
7573
f"smallest_subnormal should be QuadPrecision, got {type(finfo.smallest_subnormal)}"
76-
assert str(finfo.smallest_subnormal) == str(expected_smallest_subnormal), \
77-
f"smallest_subnormal: expected {expected_smallest_subnormal}, got {finfo.smallest_subnormal}"
74+
assert_quad_close(finfo.smallest_subnormal, "6.0e-4966")
7875

7976
def test_resolution(self):
8077
"""Test resolution property (10^-precision)."""
8178
dtype = QuadPrecDType()
8279
finfo = np.finfo(dtype)
8380

8481
# Resolution should be approximately 10^-33 for quad precision
85-
expected_resolution = QuadPrecision("1e-33")
8682
assert isinstance(finfo.resolution, QuadPrecision), \
8783
f"resolution should be QuadPrecision, got {type(finfo.resolution)}"
88-
assert str(finfo.resolution) == str(expected_resolution), \
89-
f"resolution: expected {expected_resolution}, got {finfo.resolution}"
84+
assert_quad_close(finfo.resolution, "1.0e-33")
9085

91-
def test_dtype_property(self):
92-
"""Test that finfo.dtype returns the correct dtype."""
93-
dtype = QuadPrecDType()
94-
finfo = np.finfo(dtype)
95-
96-
# finfo.dtype should return a QuadPrecDType
97-
assert isinstance(finfo.dtype, type(dtype)), \
98-
f"finfo.dtype should be QuadPrecDType, got {type(finfo.dtype)}"
99-
100-
def test_machep_and_negep(self):
101-
"""Test machep and negep exponent properties."""
102-
dtype = QuadPrecDType()
103-
finfo = np.finfo(dtype)
104-
105-
# machep: exponent that yields eps (should be -112 for quad precision: 2^-112)
106-
# negep: exponent that yields epsneg (should be -113 for quad precision: 2^-113)
107-
# These are calculated by NumPy from eps and epsneg values
108-
109-
# Just verify they exist and are integers
110-
assert isinstance(finfo.machep, (int, np.integer)), \
111-
f"machep should be integer, got {type(finfo.machep)}"
112-
assert isinstance(finfo.negep, (int, np.integer)), \
113-
f"negep should be integer, got {type(finfo.negep)}"
114-
115-
def test_finfo_comparison_with_float64(self):
116-
"""Verify quad precision has better precision than float64."""
117-
quad_finfo = np.finfo(QuadPrecDType())
118-
float64_finfo = np.finfo(np.float64)
119-
120-
# Quad precision should have more precision
121-
assert quad_finfo.bits > 64, \
122-
f"Quad bits ({quad_finfo.bits}) should be > 64"
123-
assert quad_finfo.nmant > float64_finfo.nmant, \
124-
f"Quad nmant ({quad_finfo.nmant}) should be > float64 nmant ({float64_finfo.nmant})"
125-
assert quad_finfo.precision > float64_finfo.precision, \
126-
f"Quad precision ({quad_finfo.precision}) should be > float64 precision ({float64_finfo.precision})"
127-
12886

12987
if __name__ == "__main__":
13088
pytest.main([__file__, "-v"])

0 commit comments

Comments
 (0)