11import pytest
22import numpy as np
3+ from utils import assert_quad_equal as assert_quad_close
34from 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
12987if __name__ == "__main__" :
13088 pytest .main ([__file__ , "-v" ])
0 commit comments