test_float.py 68 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571
  1. import fractions
  2. import operator
  3. import os
  4. import random
  5. import sys
  6. import struct
  7. import time
  8. import unittest
  9. from test import support
  10. from test.support import import_helper
  11. from test.test_grammar import (VALID_UNDERSCORE_LITERALS,
  12. INVALID_UNDERSCORE_LITERALS)
  13. from math import isinf, isnan, copysign, ldexp
  14. import math
  15. try:
  16. import _testcapi
  17. except ImportError:
  18. _testcapi = None
  19. HAVE_IEEE_754 = float.__getformat__("double").startswith("IEEE")
  20. INF = float("inf")
  21. NAN = float("nan")
  22. #locate file with float format test values
  23. test_dir = os.path.dirname(__file__) or os.curdir
  24. format_testfile = os.path.join(test_dir, 'formatfloat_testcases.txt')
  25. class FloatSubclass(float):
  26. pass
  27. class OtherFloatSubclass(float):
  28. pass
  29. class GeneralFloatCases(unittest.TestCase):
  30. def test_float(self):
  31. self.assertEqual(float(3.14), 3.14)
  32. self.assertEqual(float(314), 314.0)
  33. self.assertEqual(float(" 3.14 "), 3.14)
  34. self.assertRaises(ValueError, float, " 0x3.1 ")
  35. self.assertRaises(ValueError, float, " -0x3.p-1 ")
  36. self.assertRaises(ValueError, float, " +0x3.p-1 ")
  37. self.assertRaises(ValueError, float, "++3.14")
  38. self.assertRaises(ValueError, float, "+-3.14")
  39. self.assertRaises(ValueError, float, "-+3.14")
  40. self.assertRaises(ValueError, float, "--3.14")
  41. self.assertRaises(ValueError, float, ".nan")
  42. self.assertRaises(ValueError, float, "+.inf")
  43. self.assertRaises(ValueError, float, ".")
  44. self.assertRaises(ValueError, float, "-.")
  45. self.assertRaises(TypeError, float, {})
  46. self.assertRaisesRegex(TypeError, "not 'dict'", float, {})
  47. # Lone surrogate
  48. self.assertRaises(ValueError, float, '\uD8F0')
  49. # check that we don't accept alternate exponent markers
  50. self.assertRaises(ValueError, float, "-1.7d29")
  51. self.assertRaises(ValueError, float, "3D-14")
  52. self.assertEqual(float(" \u0663.\u0661\u0664 "), 3.14)
  53. self.assertEqual(float("\N{EM SPACE}3.14\N{EN SPACE}"), 3.14)
  54. # extra long strings should not be a problem
  55. float(b'.' + b'1'*1000)
  56. float('.' + '1'*1000)
  57. # Invalid unicode string
  58. # See bpo-34087
  59. self.assertRaises(ValueError, float, '\u3053\u3093\u306b\u3061\u306f')
  60. def test_noargs(self):
  61. self.assertEqual(float(), 0.0)
  62. def test_underscores(self):
  63. for lit in VALID_UNDERSCORE_LITERALS:
  64. if not any(ch in lit for ch in 'jJxXoObB'):
  65. self.assertEqual(float(lit), eval(lit))
  66. self.assertEqual(float(lit), float(lit.replace('_', '')))
  67. for lit in INVALID_UNDERSCORE_LITERALS:
  68. if lit in ('0_7', '09_99'): # octals are not recognized here
  69. continue
  70. if not any(ch in lit for ch in 'jJxXoObB'):
  71. self.assertRaises(ValueError, float, lit)
  72. # Additional test cases; nan and inf are never valid as literals,
  73. # only in the float() constructor, but we don't allow underscores
  74. # in or around them.
  75. self.assertRaises(ValueError, float, '_NaN')
  76. self.assertRaises(ValueError, float, 'Na_N')
  77. self.assertRaises(ValueError, float, 'IN_F')
  78. self.assertRaises(ValueError, float, '-_INF')
  79. self.assertRaises(ValueError, float, '-INF_')
  80. # Check that we handle bytes values correctly.
  81. self.assertRaises(ValueError, float, b'0_.\xff9')
  82. def test_non_numeric_input_types(self):
  83. # Test possible non-numeric types for the argument x, including
  84. # subclasses of the explicitly documented accepted types.
  85. class CustomStr(str): pass
  86. class CustomBytes(bytes): pass
  87. class CustomByteArray(bytearray): pass
  88. factories = [
  89. bytes,
  90. bytearray,
  91. lambda b: CustomStr(b.decode()),
  92. CustomBytes,
  93. CustomByteArray,
  94. memoryview,
  95. ]
  96. try:
  97. from array import array
  98. except ImportError:
  99. pass
  100. else:
  101. factories.append(lambda b: array('B', b))
  102. for f in factories:
  103. x = f(b" 3.14 ")
  104. with self.subTest(type(x)):
  105. self.assertEqual(float(x), 3.14)
  106. with self.assertRaisesRegex(ValueError, "could not convert"):
  107. float(f(b'A' * 0x10))
  108. def test_float_memoryview(self):
  109. self.assertEqual(float(memoryview(b'12.3')[1:4]), 2.3)
  110. self.assertEqual(float(memoryview(b'12.3\x00')[1:4]), 2.3)
  111. self.assertEqual(float(memoryview(b'12.3 ')[1:4]), 2.3)
  112. self.assertEqual(float(memoryview(b'12.3A')[1:4]), 2.3)
  113. self.assertEqual(float(memoryview(b'12.34')[1:4]), 2.3)
  114. def test_error_message(self):
  115. def check(s):
  116. with self.assertRaises(ValueError, msg='float(%r)' % (s,)) as cm:
  117. float(s)
  118. self.assertEqual(str(cm.exception),
  119. 'could not convert string to float: %r' % (s,))
  120. check('\xbd')
  121. check('123\xbd')
  122. check(' 123 456 ')
  123. check(b' 123 456 ')
  124. # all whitespace (cf. https://github.com/python/cpython/issues/95605)
  125. check('')
  126. check(' ')
  127. check('\t \n')
  128. # non-ascii digits (error came from non-digit '!')
  129. check('\u0663\u0661\u0664!')
  130. # embedded NUL
  131. check('123\x00')
  132. check('123\x00 245')
  133. check('123\x00245')
  134. # byte string with embedded NUL
  135. check(b'123\x00')
  136. # non-UTF-8 byte string
  137. check(b'123\xa0')
  138. @support.run_with_locale('LC_NUMERIC', 'fr_FR', 'de_DE')
  139. def test_float_with_comma(self):
  140. # set locale to something that doesn't use '.' for the decimal point
  141. # float must not accept the locale specific decimal point but
  142. # it still has to accept the normal python syntax
  143. import locale
  144. if not locale.localeconv()['decimal_point'] == ',':
  145. self.skipTest('decimal_point is not ","')
  146. self.assertEqual(float(" 3.14 "), 3.14)
  147. self.assertEqual(float("+3.14 "), 3.14)
  148. self.assertEqual(float("-3.14 "), -3.14)
  149. self.assertEqual(float(".14 "), .14)
  150. self.assertEqual(float("3. "), 3.0)
  151. self.assertEqual(float("3.e3 "), 3000.0)
  152. self.assertEqual(float("3.2e3 "), 3200.0)
  153. self.assertEqual(float("2.5e-1 "), 0.25)
  154. self.assertEqual(float("5e-1"), 0.5)
  155. self.assertRaises(ValueError, float, " 3,14 ")
  156. self.assertRaises(ValueError, float, " +3,14 ")
  157. self.assertRaises(ValueError, float, " -3,14 ")
  158. self.assertRaises(ValueError, float, " 0x3.1 ")
  159. self.assertRaises(ValueError, float, " -0x3.p-1 ")
  160. self.assertRaises(ValueError, float, " +0x3.p-1 ")
  161. self.assertEqual(float(" 25.e-1 "), 2.5)
  162. self.assertAlmostEqual(float(" .25e-1 "), .025)
  163. def test_floatconversion(self):
  164. # Make sure that calls to __float__() work properly
  165. class Foo1(object):
  166. def __float__(self):
  167. return 42.
  168. class Foo2(float):
  169. def __float__(self):
  170. return 42.
  171. class Foo3(float):
  172. def __new__(cls, value=0.):
  173. return float.__new__(cls, 2*value)
  174. def __float__(self):
  175. return self
  176. class Foo4(float):
  177. def __float__(self):
  178. return 42
  179. # Issue 5759: __float__ not called on str subclasses (though it is on
  180. # unicode subclasses).
  181. class FooStr(str):
  182. def __float__(self):
  183. return float(str(self)) + 1
  184. self.assertEqual(float(Foo1()), 42.)
  185. self.assertEqual(float(Foo2()), 42.)
  186. with self.assertWarns(DeprecationWarning):
  187. self.assertEqual(float(Foo3(21)), 42.)
  188. self.assertRaises(TypeError, float, Foo4(42))
  189. self.assertEqual(float(FooStr('8')), 9.)
  190. class Foo5:
  191. def __float__(self):
  192. return ""
  193. self.assertRaises(TypeError, time.sleep, Foo5())
  194. # Issue #24731
  195. class F:
  196. def __float__(self):
  197. return OtherFloatSubclass(42.)
  198. with self.assertWarns(DeprecationWarning):
  199. self.assertEqual(float(F()), 42.)
  200. with self.assertWarns(DeprecationWarning):
  201. self.assertIs(type(float(F())), float)
  202. with self.assertWarns(DeprecationWarning):
  203. self.assertEqual(FloatSubclass(F()), 42.)
  204. with self.assertWarns(DeprecationWarning):
  205. self.assertIs(type(FloatSubclass(F())), FloatSubclass)
  206. class MyIndex:
  207. def __init__(self, value):
  208. self.value = value
  209. def __index__(self):
  210. return self.value
  211. self.assertEqual(float(MyIndex(42)), 42.0)
  212. self.assertRaises(OverflowError, float, MyIndex(2**2000))
  213. class MyInt:
  214. def __int__(self):
  215. return 42
  216. self.assertRaises(TypeError, float, MyInt())
  217. def test_keyword_args(self):
  218. with self.assertRaisesRegex(TypeError, 'keyword argument'):
  219. float(x='3.14')
  220. def test_keywords_in_subclass(self):
  221. class subclass(float):
  222. pass
  223. u = subclass(2.5)
  224. self.assertIs(type(u), subclass)
  225. self.assertEqual(float(u), 2.5)
  226. with self.assertRaises(TypeError):
  227. subclass(x=0)
  228. class subclass_with_init(float):
  229. def __init__(self, arg, newarg=None):
  230. self.newarg = newarg
  231. u = subclass_with_init(2.5, newarg=3)
  232. self.assertIs(type(u), subclass_with_init)
  233. self.assertEqual(float(u), 2.5)
  234. self.assertEqual(u.newarg, 3)
  235. class subclass_with_new(float):
  236. def __new__(cls, arg, newarg=None):
  237. self = super().__new__(cls, arg)
  238. self.newarg = newarg
  239. return self
  240. u = subclass_with_new(2.5, newarg=3)
  241. self.assertIs(type(u), subclass_with_new)
  242. self.assertEqual(float(u), 2.5)
  243. self.assertEqual(u.newarg, 3)
  244. def test_is_integer(self):
  245. self.assertFalse((1.1).is_integer())
  246. self.assertTrue((1.).is_integer())
  247. self.assertFalse(float("nan").is_integer())
  248. self.assertFalse(float("inf").is_integer())
  249. def test_floatasratio(self):
  250. for f, ratio in [
  251. (0.875, (7, 8)),
  252. (-0.875, (-7, 8)),
  253. (0.0, (0, 1)),
  254. (11.5, (23, 2)),
  255. ]:
  256. self.assertEqual(f.as_integer_ratio(), ratio)
  257. for i in range(10000):
  258. f = random.random()
  259. f *= 10 ** random.randint(-100, 100)
  260. n, d = f.as_integer_ratio()
  261. self.assertEqual(float(n).__truediv__(d), f)
  262. R = fractions.Fraction
  263. self.assertEqual(R(0, 1),
  264. R(*float(0.0).as_integer_ratio()))
  265. self.assertEqual(R(5, 2),
  266. R(*float(2.5).as_integer_ratio()))
  267. self.assertEqual(R(1, 2),
  268. R(*float(0.5).as_integer_ratio()))
  269. self.assertEqual(R(4728779608739021, 2251799813685248),
  270. R(*float(2.1).as_integer_ratio()))
  271. self.assertEqual(R(-4728779608739021, 2251799813685248),
  272. R(*float(-2.1).as_integer_ratio()))
  273. self.assertEqual(R(-2100, 1),
  274. R(*float(-2100.0).as_integer_ratio()))
  275. self.assertRaises(OverflowError, float('inf').as_integer_ratio)
  276. self.assertRaises(OverflowError, float('-inf').as_integer_ratio)
  277. self.assertRaises(ValueError, float('nan').as_integer_ratio)
  278. def test_float_containment(self):
  279. floats = (INF, -INF, 0.0, 1.0, NAN)
  280. for f in floats:
  281. self.assertIn(f, [f])
  282. self.assertIn(f, (f,))
  283. self.assertIn(f, {f})
  284. self.assertIn(f, {f: None})
  285. self.assertEqual([f].count(f), 1, "[].count('%r') != 1" % f)
  286. self.assertIn(f, floats)
  287. for f in floats:
  288. # nonidentical containers, same type, same contents
  289. self.assertTrue([f] == [f], "[%r] != [%r]" % (f, f))
  290. self.assertTrue((f,) == (f,), "(%r,) != (%r,)" % (f, f))
  291. self.assertTrue({f} == {f}, "{%r} != {%r}" % (f, f))
  292. self.assertTrue({f : None} == {f: None}, "{%r : None} != "
  293. "{%r : None}" % (f, f))
  294. # identical containers
  295. l, t, s, d = [f], (f,), {f}, {f: None}
  296. self.assertTrue(l == l, "[%r] not equal to itself" % f)
  297. self.assertTrue(t == t, "(%r,) not equal to itself" % f)
  298. self.assertTrue(s == s, "{%r} not equal to itself" % f)
  299. self.assertTrue(d == d, "{%r : None} not equal to itself" % f)
  300. def assertEqualAndEqualSign(self, a, b):
  301. # fail unless a == b and a and b have the same sign bit;
  302. # the only difference from assertEqual is that this test
  303. # distinguishes -0.0 and 0.0.
  304. self.assertEqual((a, copysign(1.0, a)), (b, copysign(1.0, b)))
  305. def test_float_floor(self):
  306. self.assertIsInstance(float(0.5).__floor__(), int)
  307. self.assertEqual(float(0.5).__floor__(), 0)
  308. self.assertEqual(float(1.0).__floor__(), 1)
  309. self.assertEqual(float(1.5).__floor__(), 1)
  310. self.assertEqual(float(-0.5).__floor__(), -1)
  311. self.assertEqual(float(-1.0).__floor__(), -1)
  312. self.assertEqual(float(-1.5).__floor__(), -2)
  313. self.assertEqual(float(1.23e167).__floor__(), 1.23e167)
  314. self.assertEqual(float(-1.23e167).__floor__(), -1.23e167)
  315. self.assertRaises(ValueError, float("nan").__floor__)
  316. self.assertRaises(OverflowError, float("inf").__floor__)
  317. self.assertRaises(OverflowError, float("-inf").__floor__)
  318. def test_float_ceil(self):
  319. self.assertIsInstance(float(0.5).__ceil__(), int)
  320. self.assertEqual(float(0.5).__ceil__(), 1)
  321. self.assertEqual(float(1.0).__ceil__(), 1)
  322. self.assertEqual(float(1.5).__ceil__(), 2)
  323. self.assertEqual(float(-0.5).__ceil__(), 0)
  324. self.assertEqual(float(-1.0).__ceil__(), -1)
  325. self.assertEqual(float(-1.5).__ceil__(), -1)
  326. self.assertEqual(float(1.23e167).__ceil__(), 1.23e167)
  327. self.assertEqual(float(-1.23e167).__ceil__(), -1.23e167)
  328. self.assertRaises(ValueError, float("nan").__ceil__)
  329. self.assertRaises(OverflowError, float("inf").__ceil__)
  330. self.assertRaises(OverflowError, float("-inf").__ceil__)
  331. @support.requires_IEEE_754
  332. def test_float_mod(self):
  333. # Check behaviour of % operator for IEEE 754 special cases.
  334. # In particular, check signs of zeros.
  335. mod = operator.mod
  336. self.assertEqualAndEqualSign(mod(-1.0, 1.0), 0.0)
  337. self.assertEqualAndEqualSign(mod(-1e-100, 1.0), 1.0)
  338. self.assertEqualAndEqualSign(mod(-0.0, 1.0), 0.0)
  339. self.assertEqualAndEqualSign(mod(0.0, 1.0), 0.0)
  340. self.assertEqualAndEqualSign(mod(1e-100, 1.0), 1e-100)
  341. self.assertEqualAndEqualSign(mod(1.0, 1.0), 0.0)
  342. self.assertEqualAndEqualSign(mod(-1.0, -1.0), -0.0)
  343. self.assertEqualAndEqualSign(mod(-1e-100, -1.0), -1e-100)
  344. self.assertEqualAndEqualSign(mod(-0.0, -1.0), -0.0)
  345. self.assertEqualAndEqualSign(mod(0.0, -1.0), -0.0)
  346. self.assertEqualAndEqualSign(mod(1e-100, -1.0), -1.0)
  347. self.assertEqualAndEqualSign(mod(1.0, -1.0), -0.0)
  348. @support.requires_IEEE_754
  349. def test_float_pow(self):
  350. # test builtin pow and ** operator for IEEE 754 special cases.
  351. # Special cases taken from section F.9.4.4 of the C99 specification
  352. for pow_op in pow, operator.pow:
  353. # x**NAN is NAN for any x except 1
  354. self.assertTrue(isnan(pow_op(-INF, NAN)))
  355. self.assertTrue(isnan(pow_op(-2.0, NAN)))
  356. self.assertTrue(isnan(pow_op(-1.0, NAN)))
  357. self.assertTrue(isnan(pow_op(-0.5, NAN)))
  358. self.assertTrue(isnan(pow_op(-0.0, NAN)))
  359. self.assertTrue(isnan(pow_op(0.0, NAN)))
  360. self.assertTrue(isnan(pow_op(0.5, NAN)))
  361. self.assertTrue(isnan(pow_op(2.0, NAN)))
  362. self.assertTrue(isnan(pow_op(INF, NAN)))
  363. self.assertTrue(isnan(pow_op(NAN, NAN)))
  364. # NAN**y is NAN for any y except +-0
  365. self.assertTrue(isnan(pow_op(NAN, -INF)))
  366. self.assertTrue(isnan(pow_op(NAN, -2.0)))
  367. self.assertTrue(isnan(pow_op(NAN, -1.0)))
  368. self.assertTrue(isnan(pow_op(NAN, -0.5)))
  369. self.assertTrue(isnan(pow_op(NAN, 0.5)))
  370. self.assertTrue(isnan(pow_op(NAN, 1.0)))
  371. self.assertTrue(isnan(pow_op(NAN, 2.0)))
  372. self.assertTrue(isnan(pow_op(NAN, INF)))
  373. # (+-0)**y raises ZeroDivisionError for y a negative odd integer
  374. self.assertRaises(ZeroDivisionError, pow_op, -0.0, -1.0)
  375. self.assertRaises(ZeroDivisionError, pow_op, 0.0, -1.0)
  376. # (+-0)**y raises ZeroDivisionError for y finite and negative
  377. # but not an odd integer
  378. self.assertRaises(ZeroDivisionError, pow_op, -0.0, -2.0)
  379. self.assertRaises(ZeroDivisionError, pow_op, -0.0, -0.5)
  380. self.assertRaises(ZeroDivisionError, pow_op, 0.0, -2.0)
  381. self.assertRaises(ZeroDivisionError, pow_op, 0.0, -0.5)
  382. # (+-0)**y is +-0 for y a positive odd integer
  383. self.assertEqualAndEqualSign(pow_op(-0.0, 1.0), -0.0)
  384. self.assertEqualAndEqualSign(pow_op(0.0, 1.0), 0.0)
  385. # (+-0)**y is 0 for y finite and positive but not an odd integer
  386. self.assertEqualAndEqualSign(pow_op(-0.0, 0.5), 0.0)
  387. self.assertEqualAndEqualSign(pow_op(-0.0, 2.0), 0.0)
  388. self.assertEqualAndEqualSign(pow_op(0.0, 0.5), 0.0)
  389. self.assertEqualAndEqualSign(pow_op(0.0, 2.0), 0.0)
  390. # (-1)**+-inf is 1
  391. self.assertEqualAndEqualSign(pow_op(-1.0, -INF), 1.0)
  392. self.assertEqualAndEqualSign(pow_op(-1.0, INF), 1.0)
  393. # 1**y is 1 for any y, even if y is an infinity or nan
  394. self.assertEqualAndEqualSign(pow_op(1.0, -INF), 1.0)
  395. self.assertEqualAndEqualSign(pow_op(1.0, -2.0), 1.0)
  396. self.assertEqualAndEqualSign(pow_op(1.0, -1.0), 1.0)
  397. self.assertEqualAndEqualSign(pow_op(1.0, -0.5), 1.0)
  398. self.assertEqualAndEqualSign(pow_op(1.0, -0.0), 1.0)
  399. self.assertEqualAndEqualSign(pow_op(1.0, 0.0), 1.0)
  400. self.assertEqualAndEqualSign(pow_op(1.0, 0.5), 1.0)
  401. self.assertEqualAndEqualSign(pow_op(1.0, 1.0), 1.0)
  402. self.assertEqualAndEqualSign(pow_op(1.0, 2.0), 1.0)
  403. self.assertEqualAndEqualSign(pow_op(1.0, INF), 1.0)
  404. self.assertEqualAndEqualSign(pow_op(1.0, NAN), 1.0)
  405. # x**+-0 is 1 for any x, even if x is a zero, infinity, or nan
  406. self.assertEqualAndEqualSign(pow_op(-INF, 0.0), 1.0)
  407. self.assertEqualAndEqualSign(pow_op(-2.0, 0.0), 1.0)
  408. self.assertEqualAndEqualSign(pow_op(-1.0, 0.0), 1.0)
  409. self.assertEqualAndEqualSign(pow_op(-0.5, 0.0), 1.0)
  410. self.assertEqualAndEqualSign(pow_op(-0.0, 0.0), 1.0)
  411. self.assertEqualAndEqualSign(pow_op(0.0, 0.0), 1.0)
  412. self.assertEqualAndEqualSign(pow_op(0.5, 0.0), 1.0)
  413. self.assertEqualAndEqualSign(pow_op(1.0, 0.0), 1.0)
  414. self.assertEqualAndEqualSign(pow_op(2.0, 0.0), 1.0)
  415. self.assertEqualAndEqualSign(pow_op(INF, 0.0), 1.0)
  416. self.assertEqualAndEqualSign(pow_op(NAN, 0.0), 1.0)
  417. self.assertEqualAndEqualSign(pow_op(-INF, -0.0), 1.0)
  418. self.assertEqualAndEqualSign(pow_op(-2.0, -0.0), 1.0)
  419. self.assertEqualAndEqualSign(pow_op(-1.0, -0.0), 1.0)
  420. self.assertEqualAndEqualSign(pow_op(-0.5, -0.0), 1.0)
  421. self.assertEqualAndEqualSign(pow_op(-0.0, -0.0), 1.0)
  422. self.assertEqualAndEqualSign(pow_op(0.0, -0.0), 1.0)
  423. self.assertEqualAndEqualSign(pow_op(0.5, -0.0), 1.0)
  424. self.assertEqualAndEqualSign(pow_op(1.0, -0.0), 1.0)
  425. self.assertEqualAndEqualSign(pow_op(2.0, -0.0), 1.0)
  426. self.assertEqualAndEqualSign(pow_op(INF, -0.0), 1.0)
  427. self.assertEqualAndEqualSign(pow_op(NAN, -0.0), 1.0)
  428. # x**y defers to complex pow for finite negative x and
  429. # non-integral y.
  430. self.assertEqual(type(pow_op(-2.0, -0.5)), complex)
  431. self.assertEqual(type(pow_op(-2.0, 0.5)), complex)
  432. self.assertEqual(type(pow_op(-1.0, -0.5)), complex)
  433. self.assertEqual(type(pow_op(-1.0, 0.5)), complex)
  434. self.assertEqual(type(pow_op(-0.5, -0.5)), complex)
  435. self.assertEqual(type(pow_op(-0.5, 0.5)), complex)
  436. # x**-INF is INF for abs(x) < 1
  437. self.assertEqualAndEqualSign(pow_op(-0.5, -INF), INF)
  438. self.assertEqualAndEqualSign(pow_op(-0.0, -INF), INF)
  439. self.assertEqualAndEqualSign(pow_op(0.0, -INF), INF)
  440. self.assertEqualAndEqualSign(pow_op(0.5, -INF), INF)
  441. # x**-INF is 0 for abs(x) > 1
  442. self.assertEqualAndEqualSign(pow_op(-INF, -INF), 0.0)
  443. self.assertEqualAndEqualSign(pow_op(-2.0, -INF), 0.0)
  444. self.assertEqualAndEqualSign(pow_op(2.0, -INF), 0.0)
  445. self.assertEqualAndEqualSign(pow_op(INF, -INF), 0.0)
  446. # x**INF is 0 for abs(x) < 1
  447. self.assertEqualAndEqualSign(pow_op(-0.5, INF), 0.0)
  448. self.assertEqualAndEqualSign(pow_op(-0.0, INF), 0.0)
  449. self.assertEqualAndEqualSign(pow_op(0.0, INF), 0.0)
  450. self.assertEqualAndEqualSign(pow_op(0.5, INF), 0.0)
  451. # x**INF is INF for abs(x) > 1
  452. self.assertEqualAndEqualSign(pow_op(-INF, INF), INF)
  453. self.assertEqualAndEqualSign(pow_op(-2.0, INF), INF)
  454. self.assertEqualAndEqualSign(pow_op(2.0, INF), INF)
  455. self.assertEqualAndEqualSign(pow_op(INF, INF), INF)
  456. # (-INF)**y is -0.0 for y a negative odd integer
  457. self.assertEqualAndEqualSign(pow_op(-INF, -1.0), -0.0)
  458. # (-INF)**y is 0.0 for y negative but not an odd integer
  459. self.assertEqualAndEqualSign(pow_op(-INF, -0.5), 0.0)
  460. self.assertEqualAndEqualSign(pow_op(-INF, -2.0), 0.0)
  461. # (-INF)**y is -INF for y a positive odd integer
  462. self.assertEqualAndEqualSign(pow_op(-INF, 1.0), -INF)
  463. # (-INF)**y is INF for y positive but not an odd integer
  464. self.assertEqualAndEqualSign(pow_op(-INF, 0.5), INF)
  465. self.assertEqualAndEqualSign(pow_op(-INF, 2.0), INF)
  466. # INF**y is INF for y positive
  467. self.assertEqualAndEqualSign(pow_op(INF, 0.5), INF)
  468. self.assertEqualAndEqualSign(pow_op(INF, 1.0), INF)
  469. self.assertEqualAndEqualSign(pow_op(INF, 2.0), INF)
  470. # INF**y is 0.0 for y negative
  471. self.assertEqualAndEqualSign(pow_op(INF, -2.0), 0.0)
  472. self.assertEqualAndEqualSign(pow_op(INF, -1.0), 0.0)
  473. self.assertEqualAndEqualSign(pow_op(INF, -0.5), 0.0)
  474. # basic checks not covered by the special cases above
  475. self.assertEqualAndEqualSign(pow_op(-2.0, -2.0), 0.25)
  476. self.assertEqualAndEqualSign(pow_op(-2.0, -1.0), -0.5)
  477. self.assertEqualAndEqualSign(pow_op(-2.0, -0.0), 1.0)
  478. self.assertEqualAndEqualSign(pow_op(-2.0, 0.0), 1.0)
  479. self.assertEqualAndEqualSign(pow_op(-2.0, 1.0), -2.0)
  480. self.assertEqualAndEqualSign(pow_op(-2.0, 2.0), 4.0)
  481. self.assertEqualAndEqualSign(pow_op(-1.0, -2.0), 1.0)
  482. self.assertEqualAndEqualSign(pow_op(-1.0, -1.0), -1.0)
  483. self.assertEqualAndEqualSign(pow_op(-1.0, -0.0), 1.0)
  484. self.assertEqualAndEqualSign(pow_op(-1.0, 0.0), 1.0)
  485. self.assertEqualAndEqualSign(pow_op(-1.0, 1.0), -1.0)
  486. self.assertEqualAndEqualSign(pow_op(-1.0, 2.0), 1.0)
  487. self.assertEqualAndEqualSign(pow_op(2.0, -2.0), 0.25)
  488. self.assertEqualAndEqualSign(pow_op(2.0, -1.0), 0.5)
  489. self.assertEqualAndEqualSign(pow_op(2.0, -0.0), 1.0)
  490. self.assertEqualAndEqualSign(pow_op(2.0, 0.0), 1.0)
  491. self.assertEqualAndEqualSign(pow_op(2.0, 1.0), 2.0)
  492. self.assertEqualAndEqualSign(pow_op(2.0, 2.0), 4.0)
  493. # 1 ** large and -1 ** large; some libms apparently
  494. # have problems with these
  495. self.assertEqualAndEqualSign(pow_op(1.0, -1e100), 1.0)
  496. self.assertEqualAndEqualSign(pow_op(1.0, 1e100), 1.0)
  497. self.assertEqualAndEqualSign(pow_op(-1.0, -1e100), 1.0)
  498. self.assertEqualAndEqualSign(pow_op(-1.0, 1e100), 1.0)
  499. # check sign for results that underflow to 0
  500. self.assertEqualAndEqualSign(pow_op(-2.0, -2000.0), 0.0)
  501. self.assertEqual(type(pow_op(-2.0, -2000.5)), complex)
  502. self.assertEqualAndEqualSign(pow_op(-2.0, -2001.0), -0.0)
  503. self.assertEqualAndEqualSign(pow_op(2.0, -2000.0), 0.0)
  504. self.assertEqualAndEqualSign(pow_op(2.0, -2000.5), 0.0)
  505. self.assertEqualAndEqualSign(pow_op(2.0, -2001.0), 0.0)
  506. self.assertEqualAndEqualSign(pow_op(-0.5, 2000.0), 0.0)
  507. self.assertEqual(type(pow_op(-0.5, 2000.5)), complex)
  508. self.assertEqualAndEqualSign(pow_op(-0.5, 2001.0), -0.0)
  509. self.assertEqualAndEqualSign(pow_op(0.5, 2000.0), 0.0)
  510. self.assertEqualAndEqualSign(pow_op(0.5, 2000.5), 0.0)
  511. self.assertEqualAndEqualSign(pow_op(0.5, 2001.0), 0.0)
  512. # check we don't raise an exception for subnormal results,
  513. # and validate signs. Tests currently disabled, since
  514. # they fail on systems where a subnormal result from pow
  515. # is flushed to zero (e.g. Debian/ia64.)
  516. #self.assertTrue(0.0 < pow_op(0.5, 1048) < 1e-315)
  517. #self.assertTrue(0.0 < pow_op(-0.5, 1048) < 1e-315)
  518. #self.assertTrue(0.0 < pow_op(0.5, 1047) < 1e-315)
  519. #self.assertTrue(0.0 > pow_op(-0.5, 1047) > -1e-315)
  520. #self.assertTrue(0.0 < pow_op(2.0, -1048) < 1e-315)
  521. #self.assertTrue(0.0 < pow_op(-2.0, -1048) < 1e-315)
  522. #self.assertTrue(0.0 < pow_op(2.0, -1047) < 1e-315)
  523. #self.assertTrue(0.0 > pow_op(-2.0, -1047) > -1e-315)
  524. def test_hash(self):
  525. for x in range(-30, 30):
  526. self.assertEqual(hash(float(x)), hash(x))
  527. self.assertEqual(hash(float(sys.float_info.max)),
  528. hash(int(sys.float_info.max)))
  529. self.assertEqual(hash(float('inf')), sys.hash_info.inf)
  530. self.assertEqual(hash(float('-inf')), -sys.hash_info.inf)
  531. def test_hash_nan(self):
  532. value = float('nan')
  533. self.assertEqual(hash(value), object.__hash__(value))
  534. class H:
  535. def __hash__(self):
  536. return 42
  537. class F(float, H):
  538. pass
  539. value = F('nan')
  540. self.assertEqual(hash(value), object.__hash__(value))
  541. @unittest.skipUnless(hasattr(float, "__getformat__"), "requires __getformat__")
  542. class FormatFunctionsTestCase(unittest.TestCase):
  543. def test_getformat(self):
  544. self.assertIn(float.__getformat__('double'),
  545. ['unknown', 'IEEE, big-endian', 'IEEE, little-endian'])
  546. self.assertIn(float.__getformat__('float'),
  547. ['unknown', 'IEEE, big-endian', 'IEEE, little-endian'])
  548. self.assertRaises(ValueError, float.__getformat__, 'chicken')
  549. self.assertRaises(TypeError, float.__getformat__, 1)
  550. BE_DOUBLE_INF = b'\x7f\xf0\x00\x00\x00\x00\x00\x00'
  551. LE_DOUBLE_INF = bytes(reversed(BE_DOUBLE_INF))
  552. BE_DOUBLE_NAN = b'\x7f\xf8\x00\x00\x00\x00\x00\x00'
  553. LE_DOUBLE_NAN = bytes(reversed(BE_DOUBLE_NAN))
  554. BE_FLOAT_INF = b'\x7f\x80\x00\x00'
  555. LE_FLOAT_INF = bytes(reversed(BE_FLOAT_INF))
  556. BE_FLOAT_NAN = b'\x7f\xc0\x00\x00'
  557. LE_FLOAT_NAN = bytes(reversed(BE_FLOAT_NAN))
  558. # on an IEEE platform, all we guarantee is that bit patterns
  559. # representing infinities or NaNs do not raise an exception; all else
  560. # is accident (today).
  561. # let's also try to guarantee that -0.0 and 0.0 don't get confused.
  562. class IEEEFormatTestCase(unittest.TestCase):
  563. @support.requires_IEEE_754
  564. def test_double_specials_do_unpack(self):
  565. for fmt, data in [('>d', BE_DOUBLE_INF),
  566. ('>d', BE_DOUBLE_NAN),
  567. ('<d', LE_DOUBLE_INF),
  568. ('<d', LE_DOUBLE_NAN)]:
  569. struct.unpack(fmt, data)
  570. @support.requires_IEEE_754
  571. def test_float_specials_do_unpack(self):
  572. for fmt, data in [('>f', BE_FLOAT_INF),
  573. ('>f', BE_FLOAT_NAN),
  574. ('<f', LE_FLOAT_INF),
  575. ('<f', LE_FLOAT_NAN)]:
  576. struct.unpack(fmt, data)
  577. @support.requires_IEEE_754
  578. @unittest.skipIf(_testcapi is None, 'needs _testcapi')
  579. def test_serialized_float_rounding(self):
  580. FLT_MAX = _testcapi.FLT_MAX
  581. self.assertEqual(struct.pack("<f", 3.40282356e38), struct.pack("<f", FLT_MAX))
  582. self.assertEqual(struct.pack("<f", -3.40282356e38), struct.pack("<f", -FLT_MAX))
  583. class FormatTestCase(unittest.TestCase):
  584. def test_format(self):
  585. # these should be rewritten to use both format(x, spec) and
  586. # x.__format__(spec)
  587. self.assertEqual(format(0.0, 'f'), '0.000000')
  588. # the default is 'g', except for empty format spec
  589. self.assertEqual(format(0.0, ''), '0.0')
  590. self.assertEqual(format(0.01, ''), '0.01')
  591. self.assertEqual(format(0.01, 'g'), '0.01')
  592. # empty presentation type should format in the same way as str
  593. # (issue 5920)
  594. x = 100/7.
  595. self.assertEqual(format(x, ''), str(x))
  596. self.assertEqual(format(x, '-'), str(x))
  597. self.assertEqual(format(x, '>'), str(x))
  598. self.assertEqual(format(x, '2'), str(x))
  599. self.assertEqual(format(1.0, 'f'), '1.000000')
  600. self.assertEqual(format(-1.0, 'f'), '-1.000000')
  601. self.assertEqual(format( 1.0, ' f'), ' 1.000000')
  602. self.assertEqual(format(-1.0, ' f'), '-1.000000')
  603. self.assertEqual(format( 1.0, '+f'), '+1.000000')
  604. self.assertEqual(format(-1.0, '+f'), '-1.000000')
  605. # % formatting
  606. self.assertEqual(format(-1.0, '%'), '-100.000000%')
  607. # conversion to string should fail
  608. self.assertRaises(ValueError, format, 3.0, "s")
  609. # confirm format options expected to fail on floats, such as integer
  610. # presentation types
  611. for format_spec in 'sbcdoxX':
  612. self.assertRaises(ValueError, format, 0.0, format_spec)
  613. self.assertRaises(ValueError, format, 1.0, format_spec)
  614. self.assertRaises(ValueError, format, -1.0, format_spec)
  615. self.assertRaises(ValueError, format, 1e100, format_spec)
  616. self.assertRaises(ValueError, format, -1e100, format_spec)
  617. self.assertRaises(ValueError, format, 1e-100, format_spec)
  618. self.assertRaises(ValueError, format, -1e-100, format_spec)
  619. # issue 3382
  620. self.assertEqual(format(NAN, 'f'), 'nan')
  621. self.assertEqual(format(NAN, 'F'), 'NAN')
  622. self.assertEqual(format(INF, 'f'), 'inf')
  623. self.assertEqual(format(INF, 'F'), 'INF')
  624. @support.requires_IEEE_754
  625. def test_format_testfile(self):
  626. with open(format_testfile, encoding="utf-8") as testfile:
  627. for line in testfile:
  628. if line.startswith('--'):
  629. continue
  630. line = line.strip()
  631. if not line:
  632. continue
  633. lhs, rhs = map(str.strip, line.split('->'))
  634. fmt, arg = lhs.split()
  635. self.assertEqual(fmt % float(arg), rhs)
  636. self.assertEqual(fmt % -float(arg), '-' + rhs)
  637. def test_issue5864(self):
  638. self.assertEqual(format(123.456, '.4'), '123.5')
  639. self.assertEqual(format(1234.56, '.4'), '1.235e+03')
  640. self.assertEqual(format(12345.6, '.4'), '1.235e+04')
  641. def test_issue35560(self):
  642. self.assertEqual(format(123.0, '00'), '123.0')
  643. self.assertEqual(format(123.34, '00f'), '123.340000')
  644. self.assertEqual(format(123.34, '00e'), '1.233400e+02')
  645. self.assertEqual(format(123.34, '00g'), '123.34')
  646. self.assertEqual(format(123.34, '00.10f'), '123.3400000000')
  647. self.assertEqual(format(123.34, '00.10e'), '1.2334000000e+02')
  648. self.assertEqual(format(123.34, '00.10g'), '123.34')
  649. self.assertEqual(format(123.34, '01f'), '123.340000')
  650. self.assertEqual(format(-123.0, '00'), '-123.0')
  651. self.assertEqual(format(-123.34, '00f'), '-123.340000')
  652. self.assertEqual(format(-123.34, '00e'), '-1.233400e+02')
  653. self.assertEqual(format(-123.34, '00g'), '-123.34')
  654. self.assertEqual(format(-123.34, '00.10f'), '-123.3400000000')
  655. self.assertEqual(format(-123.34, '00.10f'), '-123.3400000000')
  656. self.assertEqual(format(-123.34, '00.10e'), '-1.2334000000e+02')
  657. self.assertEqual(format(-123.34, '00.10g'), '-123.34')
  658. class ReprTestCase(unittest.TestCase):
  659. def test_repr(self):
  660. with open(os.path.join(os.path.split(__file__)[0],
  661. 'floating_points.txt'), encoding="utf-8") as floats_file:
  662. for line in floats_file:
  663. line = line.strip()
  664. if not line or line.startswith('#'):
  665. continue
  666. v = eval(line)
  667. self.assertEqual(v, eval(repr(v)))
  668. @unittest.skipUnless(getattr(sys, 'float_repr_style', '') == 'short',
  669. "applies only when using short float repr style")
  670. def test_short_repr(self):
  671. # test short float repr introduced in Python 3.1. One aspect
  672. # of this repr is that we get some degree of str -> float ->
  673. # str roundtripping. In particular, for any numeric string
  674. # containing 15 or fewer significant digits, those exact same
  675. # digits (modulo trailing zeros) should appear in the output.
  676. # No more repr(0.03) -> "0.029999999999999999"!
  677. test_strings = [
  678. # output always includes *either* a decimal point and at
  679. # least one digit after that point, or an exponent.
  680. '0.0',
  681. '1.0',
  682. '0.01',
  683. '0.02',
  684. '0.03',
  685. '0.04',
  686. '0.05',
  687. '1.23456789',
  688. '10.0',
  689. '100.0',
  690. # values >= 1e16 get an exponent...
  691. '1000000000000000.0',
  692. '9999999999999990.0',
  693. '1e+16',
  694. '1e+17',
  695. # ... and so do values < 1e-4
  696. '0.001',
  697. '0.001001',
  698. '0.00010000000000001',
  699. '0.0001',
  700. '9.999999999999e-05',
  701. '1e-05',
  702. # values designed to provoke failure if the FPU rounding
  703. # precision isn't set correctly
  704. '8.72293771110361e+25',
  705. '7.47005307342313e+26',
  706. '2.86438000439698e+28',
  707. '8.89142905246179e+28',
  708. '3.08578087079232e+35',
  709. ]
  710. for s in test_strings:
  711. negs = '-'+s
  712. self.assertEqual(s, repr(float(s)))
  713. self.assertEqual(negs, repr(float(negs)))
  714. # Since Python 3.2, repr and str are identical
  715. self.assertEqual(repr(float(s)), str(float(s)))
  716. self.assertEqual(repr(float(negs)), str(float(negs)))
  717. @support.requires_IEEE_754
  718. class RoundTestCase(unittest.TestCase):
  719. def test_inf_nan(self):
  720. self.assertRaises(OverflowError, round, INF)
  721. self.assertRaises(OverflowError, round, -INF)
  722. self.assertRaises(ValueError, round, NAN)
  723. self.assertRaises(TypeError, round, INF, 0.0)
  724. self.assertRaises(TypeError, round, -INF, 1.0)
  725. self.assertRaises(TypeError, round, NAN, "ceci n'est pas un integer")
  726. self.assertRaises(TypeError, round, -0.0, 1j)
  727. def test_inf_nan_ndigits(self):
  728. self.assertEqual(round(INF, 0), INF)
  729. self.assertEqual(round(-INF, 0), -INF)
  730. self.assertTrue(math.isnan(round(NAN, 0)))
  731. def test_large_n(self):
  732. for n in [324, 325, 400, 2**31-1, 2**31, 2**32, 2**100]:
  733. self.assertEqual(round(123.456, n), 123.456)
  734. self.assertEqual(round(-123.456, n), -123.456)
  735. self.assertEqual(round(1e300, n), 1e300)
  736. self.assertEqual(round(1e-320, n), 1e-320)
  737. self.assertEqual(round(1e150, 300), 1e150)
  738. self.assertEqual(round(1e300, 307), 1e300)
  739. self.assertEqual(round(-3.1415, 308), -3.1415)
  740. self.assertEqual(round(1e150, 309), 1e150)
  741. self.assertEqual(round(1.4e-315, 315), 1e-315)
  742. def test_small_n(self):
  743. for n in [-308, -309, -400, 1-2**31, -2**31, -2**31-1, -2**100]:
  744. self.assertEqual(round(123.456, n), 0.0)
  745. self.assertEqual(round(-123.456, n), -0.0)
  746. self.assertEqual(round(1e300, n), 0.0)
  747. self.assertEqual(round(1e-320, n), 0.0)
  748. def test_overflow(self):
  749. self.assertRaises(OverflowError, round, 1.6e308, -308)
  750. self.assertRaises(OverflowError, round, -1.7e308, -308)
  751. @unittest.skipUnless(getattr(sys, 'float_repr_style', '') == 'short',
  752. "applies only when using short float repr style")
  753. def test_previous_round_bugs(self):
  754. # particular cases that have occurred in bug reports
  755. self.assertEqual(round(562949953421312.5, 1),
  756. 562949953421312.5)
  757. self.assertEqual(round(56294995342131.5, 3),
  758. 56294995342131.5)
  759. # round-half-even
  760. self.assertEqual(round(25.0, -1), 20.0)
  761. self.assertEqual(round(35.0, -1), 40.0)
  762. self.assertEqual(round(45.0, -1), 40.0)
  763. self.assertEqual(round(55.0, -1), 60.0)
  764. self.assertEqual(round(65.0, -1), 60.0)
  765. self.assertEqual(round(75.0, -1), 80.0)
  766. self.assertEqual(round(85.0, -1), 80.0)
  767. self.assertEqual(round(95.0, -1), 100.0)
  768. @unittest.skipUnless(getattr(sys, 'float_repr_style', '') == 'short',
  769. "applies only when using short float repr style")
  770. def test_matches_float_format(self):
  771. # round should give the same results as float formatting
  772. for i in range(500):
  773. x = i/1000.
  774. self.assertEqual(float(format(x, '.0f')), round(x, 0))
  775. self.assertEqual(float(format(x, '.1f')), round(x, 1))
  776. self.assertEqual(float(format(x, '.2f')), round(x, 2))
  777. self.assertEqual(float(format(x, '.3f')), round(x, 3))
  778. for i in range(5, 5000, 10):
  779. x = i/1000.
  780. self.assertEqual(float(format(x, '.0f')), round(x, 0))
  781. self.assertEqual(float(format(x, '.1f')), round(x, 1))
  782. self.assertEqual(float(format(x, '.2f')), round(x, 2))
  783. self.assertEqual(float(format(x, '.3f')), round(x, 3))
  784. for i in range(500):
  785. x = random.random()
  786. self.assertEqual(float(format(x, '.0f')), round(x, 0))
  787. self.assertEqual(float(format(x, '.1f')), round(x, 1))
  788. self.assertEqual(float(format(x, '.2f')), round(x, 2))
  789. self.assertEqual(float(format(x, '.3f')), round(x, 3))
  790. def test_format_specials(self):
  791. # Test formatting of nans and infs.
  792. def test(fmt, value, expected):
  793. # Test with both % and format().
  794. self.assertEqual(fmt % value, expected, fmt)
  795. fmt = fmt[1:] # strip off the %
  796. self.assertEqual(format(value, fmt), expected, fmt)
  797. for fmt in ['%e', '%f', '%g', '%.0e', '%.6f', '%.20g',
  798. '%#e', '%#f', '%#g', '%#.20e', '%#.15f', '%#.3g']:
  799. pfmt = '%+' + fmt[1:]
  800. sfmt = '% ' + fmt[1:]
  801. test(fmt, INF, 'inf')
  802. test(fmt, -INF, '-inf')
  803. test(fmt, NAN, 'nan')
  804. test(fmt, -NAN, 'nan')
  805. # When asking for a sign, it's always provided. nans are
  806. # always positive.
  807. test(pfmt, INF, '+inf')
  808. test(pfmt, -INF, '-inf')
  809. test(pfmt, NAN, '+nan')
  810. test(pfmt, -NAN, '+nan')
  811. # When using ' ' for a sign code, only infs can be negative.
  812. # Others have a space.
  813. test(sfmt, INF, ' inf')
  814. test(sfmt, -INF, '-inf')
  815. test(sfmt, NAN, ' nan')
  816. test(sfmt, -NAN, ' nan')
  817. def test_None_ndigits(self):
  818. for x in round(1.23), round(1.23, None), round(1.23, ndigits=None):
  819. self.assertEqual(x, 1)
  820. self.assertIsInstance(x, int)
  821. for x in round(1.78), round(1.78, None), round(1.78, ndigits=None):
  822. self.assertEqual(x, 2)
  823. self.assertIsInstance(x, int)
  824. # Beginning with Python 2.6 float has cross platform compatible
  825. # ways to create and represent inf and nan
  826. class InfNanTest(unittest.TestCase):
  827. def test_inf_from_str(self):
  828. self.assertTrue(isinf(float("inf")))
  829. self.assertTrue(isinf(float("+inf")))
  830. self.assertTrue(isinf(float("-inf")))
  831. self.assertTrue(isinf(float("infinity")))
  832. self.assertTrue(isinf(float("+infinity")))
  833. self.assertTrue(isinf(float("-infinity")))
  834. self.assertEqual(repr(float("inf")), "inf")
  835. self.assertEqual(repr(float("+inf")), "inf")
  836. self.assertEqual(repr(float("-inf")), "-inf")
  837. self.assertEqual(repr(float("infinity")), "inf")
  838. self.assertEqual(repr(float("+infinity")), "inf")
  839. self.assertEqual(repr(float("-infinity")), "-inf")
  840. self.assertEqual(repr(float("INF")), "inf")
  841. self.assertEqual(repr(float("+Inf")), "inf")
  842. self.assertEqual(repr(float("-iNF")), "-inf")
  843. self.assertEqual(repr(float("Infinity")), "inf")
  844. self.assertEqual(repr(float("+iNfInItY")), "inf")
  845. self.assertEqual(repr(float("-INFINITY")), "-inf")
  846. self.assertEqual(str(float("inf")), "inf")
  847. self.assertEqual(str(float("+inf")), "inf")
  848. self.assertEqual(str(float("-inf")), "-inf")
  849. self.assertEqual(str(float("infinity")), "inf")
  850. self.assertEqual(str(float("+infinity")), "inf")
  851. self.assertEqual(str(float("-infinity")), "-inf")
  852. self.assertRaises(ValueError, float, "info")
  853. self.assertRaises(ValueError, float, "+info")
  854. self.assertRaises(ValueError, float, "-info")
  855. self.assertRaises(ValueError, float, "in")
  856. self.assertRaises(ValueError, float, "+in")
  857. self.assertRaises(ValueError, float, "-in")
  858. self.assertRaises(ValueError, float, "infinit")
  859. self.assertRaises(ValueError, float, "+Infin")
  860. self.assertRaises(ValueError, float, "-INFI")
  861. self.assertRaises(ValueError, float, "infinitys")
  862. self.assertRaises(ValueError, float, "++Inf")
  863. self.assertRaises(ValueError, float, "-+inf")
  864. self.assertRaises(ValueError, float, "+-infinity")
  865. self.assertRaises(ValueError, float, "--Infinity")
  866. def test_inf_as_str(self):
  867. self.assertEqual(repr(1e300 * 1e300), "inf")
  868. self.assertEqual(repr(-1e300 * 1e300), "-inf")
  869. self.assertEqual(str(1e300 * 1e300), "inf")
  870. self.assertEqual(str(-1e300 * 1e300), "-inf")
  871. def test_nan_from_str(self):
  872. self.assertTrue(isnan(float("nan")))
  873. self.assertTrue(isnan(float("+nan")))
  874. self.assertTrue(isnan(float("-nan")))
  875. self.assertEqual(repr(float("nan")), "nan")
  876. self.assertEqual(repr(float("+nan")), "nan")
  877. self.assertEqual(repr(float("-nan")), "nan")
  878. self.assertEqual(repr(float("NAN")), "nan")
  879. self.assertEqual(repr(float("+NAn")), "nan")
  880. self.assertEqual(repr(float("-NaN")), "nan")
  881. self.assertEqual(str(float("nan")), "nan")
  882. self.assertEqual(str(float("+nan")), "nan")
  883. self.assertEqual(str(float("-nan")), "nan")
  884. self.assertRaises(ValueError, float, "nana")
  885. self.assertRaises(ValueError, float, "+nana")
  886. self.assertRaises(ValueError, float, "-nana")
  887. self.assertRaises(ValueError, float, "na")
  888. self.assertRaises(ValueError, float, "+na")
  889. self.assertRaises(ValueError, float, "-na")
  890. self.assertRaises(ValueError, float, "++nan")
  891. self.assertRaises(ValueError, float, "-+NAN")
  892. self.assertRaises(ValueError, float, "+-NaN")
  893. self.assertRaises(ValueError, float, "--nAn")
  894. def test_nan_as_str(self):
  895. self.assertEqual(repr(1e300 * 1e300 * 0), "nan")
  896. self.assertEqual(repr(-1e300 * 1e300 * 0), "nan")
  897. self.assertEqual(str(1e300 * 1e300 * 0), "nan")
  898. self.assertEqual(str(-1e300 * 1e300 * 0), "nan")
  899. def test_inf_signs(self):
  900. self.assertEqual(copysign(1.0, float('inf')), 1.0)
  901. self.assertEqual(copysign(1.0, float('-inf')), -1.0)
  902. @unittest.skipUnless(getattr(sys, 'float_repr_style', '') == 'short',
  903. "applies only when using short float repr style")
  904. def test_nan_signs(self):
  905. # When using the dtoa.c code, the sign of float('nan') should
  906. # be predictable.
  907. self.assertEqual(copysign(1.0, float('nan')), 1.0)
  908. self.assertEqual(copysign(1.0, float('-nan')), -1.0)
  909. fromHex = float.fromhex
  910. toHex = float.hex
  911. class HexFloatTestCase(unittest.TestCase):
  912. MAX = fromHex('0x.fffffffffffff8p+1024') # max normal
  913. MIN = fromHex('0x1p-1022') # min normal
  914. TINY = fromHex('0x0.0000000000001p-1022') # min subnormal
  915. EPS = fromHex('0x0.0000000000001p0') # diff between 1.0 and next float up
  916. def identical(self, x, y):
  917. # check that floats x and y are identical, or that both
  918. # are NaNs
  919. if isnan(x) or isnan(y):
  920. if isnan(x) == isnan(y):
  921. return
  922. elif x == y and (x != 0.0 or copysign(1.0, x) == copysign(1.0, y)):
  923. return
  924. self.fail('%r not identical to %r' % (x, y))
  925. def test_ends(self):
  926. self.identical(self.MIN, ldexp(1.0, -1022))
  927. self.identical(self.TINY, ldexp(1.0, -1074))
  928. self.identical(self.EPS, ldexp(1.0, -52))
  929. self.identical(self.MAX, 2.*(ldexp(1.0, 1023) - ldexp(1.0, 970)))
  930. def test_invalid_inputs(self):
  931. invalid_inputs = [
  932. 'infi', # misspelt infinities and nans
  933. '-Infinit',
  934. '++inf',
  935. '-+Inf',
  936. '--nan',
  937. '+-NaN',
  938. 'snan',
  939. 'NaNs',
  940. 'nna',
  941. 'an',
  942. 'nf',
  943. 'nfinity',
  944. 'inity',
  945. 'iinity',
  946. '0xnan',
  947. '',
  948. ' ',
  949. 'x1.0p0',
  950. '0xX1.0p0',
  951. '+ 0x1.0p0', # internal whitespace
  952. '- 0x1.0p0',
  953. '0 x1.0p0',
  954. '0x 1.0p0',
  955. '0x1 2.0p0',
  956. '+0x1 .0p0',
  957. '0x1. 0p0',
  958. '-0x1.0 1p0',
  959. '-0x1.0 p0',
  960. '+0x1.0p +0',
  961. '0x1.0p -0',
  962. '0x1.0p 0',
  963. '+0x1.0p+ 0',
  964. '-0x1.0p- 0',
  965. '++0x1.0p-0', # double signs
  966. '--0x1.0p0',
  967. '+-0x1.0p+0',
  968. '-+0x1.0p0',
  969. '0x1.0p++0',
  970. '+0x1.0p+-0',
  971. '-0x1.0p-+0',
  972. '0x1.0p--0',
  973. '0x1.0.p0',
  974. '0x.p0', # no hex digits before or after point
  975. '0x1,p0', # wrong decimal point character
  976. '0x1pa',
  977. '0x1p\uff10', # fullwidth Unicode digits
  978. '\uff10x1p0',
  979. '0x\uff11p0',
  980. '0x1.\uff10p0',
  981. '0x1p0 \n 0x2p0',
  982. '0x1p0\0 0x1p0', # embedded null byte is not end of string
  983. ]
  984. for x in invalid_inputs:
  985. try:
  986. result = fromHex(x)
  987. except ValueError:
  988. pass
  989. else:
  990. self.fail('Expected float.fromhex(%r) to raise ValueError; '
  991. 'got %r instead' % (x, result))
  992. def test_whitespace(self):
  993. value_pairs = [
  994. ('inf', INF),
  995. ('-Infinity', -INF),
  996. ('nan', NAN),
  997. ('1.0', 1.0),
  998. ('-0x.2', -0.125),
  999. ('-0.0', -0.0)
  1000. ]
  1001. whitespace = [
  1002. '',
  1003. ' ',
  1004. '\t',
  1005. '\n',
  1006. '\n \t',
  1007. '\f',
  1008. '\v',
  1009. '\r'
  1010. ]
  1011. for inp, expected in value_pairs:
  1012. for lead in whitespace:
  1013. for trail in whitespace:
  1014. got = fromHex(lead + inp + trail)
  1015. self.identical(got, expected)
  1016. def test_from_hex(self):
  1017. MIN = self.MIN
  1018. MAX = self.MAX
  1019. TINY = self.TINY
  1020. EPS = self.EPS
  1021. # two spellings of infinity, with optional signs; case-insensitive
  1022. self.identical(fromHex('inf'), INF)
  1023. self.identical(fromHex('+Inf'), INF)
  1024. self.identical(fromHex('-INF'), -INF)
  1025. self.identical(fromHex('iNf'), INF)
  1026. self.identical(fromHex('Infinity'), INF)
  1027. self.identical(fromHex('+INFINITY'), INF)
  1028. self.identical(fromHex('-infinity'), -INF)
  1029. self.identical(fromHex('-iNFiNitY'), -INF)
  1030. # nans with optional sign; case insensitive
  1031. self.identical(fromHex('nan'), NAN)
  1032. self.identical(fromHex('+NaN'), NAN)
  1033. self.identical(fromHex('-NaN'), NAN)
  1034. self.identical(fromHex('-nAN'), NAN)
  1035. # variations in input format
  1036. self.identical(fromHex('1'), 1.0)
  1037. self.identical(fromHex('+1'), 1.0)
  1038. self.identical(fromHex('1.'), 1.0)
  1039. self.identical(fromHex('1.0'), 1.0)
  1040. self.identical(fromHex('1.0p0'), 1.0)
  1041. self.identical(fromHex('01'), 1.0)
  1042. self.identical(fromHex('01.'), 1.0)
  1043. self.identical(fromHex('0x1'), 1.0)
  1044. self.identical(fromHex('0x1.'), 1.0)
  1045. self.identical(fromHex('0x1.0'), 1.0)
  1046. self.identical(fromHex('+0x1.0'), 1.0)
  1047. self.identical(fromHex('0x1p0'), 1.0)
  1048. self.identical(fromHex('0X1p0'), 1.0)
  1049. self.identical(fromHex('0X1P0'), 1.0)
  1050. self.identical(fromHex('0x1P0'), 1.0)
  1051. self.identical(fromHex('0x1.p0'), 1.0)
  1052. self.identical(fromHex('0x1.0p0'), 1.0)
  1053. self.identical(fromHex('0x.1p4'), 1.0)
  1054. self.identical(fromHex('0x.1p04'), 1.0)
  1055. self.identical(fromHex('0x.1p004'), 1.0)
  1056. self.identical(fromHex('0x1p+0'), 1.0)
  1057. self.identical(fromHex('0x1P-0'), 1.0)
  1058. self.identical(fromHex('+0x1p0'), 1.0)
  1059. self.identical(fromHex('0x01p0'), 1.0)
  1060. self.identical(fromHex('0x1p00'), 1.0)
  1061. self.identical(fromHex(' 0x1p0 '), 1.0)
  1062. self.identical(fromHex('\n 0x1p0'), 1.0)
  1063. self.identical(fromHex('0x1p0 \t'), 1.0)
  1064. self.identical(fromHex('0xap0'), 10.0)
  1065. self.identical(fromHex('0xAp0'), 10.0)
  1066. self.identical(fromHex('0xaP0'), 10.0)
  1067. self.identical(fromHex('0xAP0'), 10.0)
  1068. self.identical(fromHex('0xbep0'), 190.0)
  1069. self.identical(fromHex('0xBep0'), 190.0)
  1070. self.identical(fromHex('0xbEp0'), 190.0)
  1071. self.identical(fromHex('0XBE0P-4'), 190.0)
  1072. self.identical(fromHex('0xBEp0'), 190.0)
  1073. self.identical(fromHex('0xB.Ep4'), 190.0)
  1074. self.identical(fromHex('0x.BEp8'), 190.0)
  1075. self.identical(fromHex('0x.0BEp12'), 190.0)
  1076. # moving the point around
  1077. pi = fromHex('0x1.921fb54442d18p1')
  1078. self.identical(fromHex('0x.006487ed5110b46p11'), pi)
  1079. self.identical(fromHex('0x.00c90fdaa22168cp10'), pi)
  1080. self.identical(fromHex('0x.01921fb54442d18p9'), pi)
  1081. self.identical(fromHex('0x.03243f6a8885a3p8'), pi)
  1082. self.identical(fromHex('0x.06487ed5110b46p7'), pi)
  1083. self.identical(fromHex('0x.0c90fdaa22168cp6'), pi)
  1084. self.identical(fromHex('0x.1921fb54442d18p5'), pi)
  1085. self.identical(fromHex('0x.3243f6a8885a3p4'), pi)
  1086. self.identical(fromHex('0x.6487ed5110b46p3'), pi)
  1087. self.identical(fromHex('0x.c90fdaa22168cp2'), pi)
  1088. self.identical(fromHex('0x1.921fb54442d18p1'), pi)
  1089. self.identical(fromHex('0x3.243f6a8885a3p0'), pi)
  1090. self.identical(fromHex('0x6.487ed5110b46p-1'), pi)
  1091. self.identical(fromHex('0xc.90fdaa22168cp-2'), pi)
  1092. self.identical(fromHex('0x19.21fb54442d18p-3'), pi)
  1093. self.identical(fromHex('0x32.43f6a8885a3p-4'), pi)
  1094. self.identical(fromHex('0x64.87ed5110b46p-5'), pi)
  1095. self.identical(fromHex('0xc9.0fdaa22168cp-6'), pi)
  1096. self.identical(fromHex('0x192.1fb54442d18p-7'), pi)
  1097. self.identical(fromHex('0x324.3f6a8885a3p-8'), pi)
  1098. self.identical(fromHex('0x648.7ed5110b46p-9'), pi)
  1099. self.identical(fromHex('0xc90.fdaa22168cp-10'), pi)
  1100. self.identical(fromHex('0x1921.fb54442d18p-11'), pi)
  1101. # ...
  1102. self.identical(fromHex('0x1921fb54442d1.8p-47'), pi)
  1103. self.identical(fromHex('0x3243f6a8885a3p-48'), pi)
  1104. self.identical(fromHex('0x6487ed5110b46p-49'), pi)
  1105. self.identical(fromHex('0xc90fdaa22168cp-50'), pi)
  1106. self.identical(fromHex('0x1921fb54442d18p-51'), pi)
  1107. self.identical(fromHex('0x3243f6a8885a30p-52'), pi)
  1108. self.identical(fromHex('0x6487ed5110b460p-53'), pi)
  1109. self.identical(fromHex('0xc90fdaa22168c0p-54'), pi)
  1110. self.identical(fromHex('0x1921fb54442d180p-55'), pi)
  1111. # results that should overflow...
  1112. self.assertRaises(OverflowError, fromHex, '-0x1p1024')
  1113. self.assertRaises(OverflowError, fromHex, '0x1p+1025')
  1114. self.assertRaises(OverflowError, fromHex, '+0X1p1030')
  1115. self.assertRaises(OverflowError, fromHex, '-0x1p+1100')
  1116. self.assertRaises(OverflowError, fromHex, '0X1p123456789123456789')
  1117. self.assertRaises(OverflowError, fromHex, '+0X.8p+1025')
  1118. self.assertRaises(OverflowError, fromHex, '+0x0.8p1025')
  1119. self.assertRaises(OverflowError, fromHex, '-0x0.4p1026')
  1120. self.assertRaises(OverflowError, fromHex, '0X2p+1023')
  1121. self.assertRaises(OverflowError, fromHex, '0x2.p1023')
  1122. self.assertRaises(OverflowError, fromHex, '-0x2.0p+1023')
  1123. self.assertRaises(OverflowError, fromHex, '+0X4p+1022')
  1124. self.assertRaises(OverflowError, fromHex, '0x1.ffffffffffffffp+1023')
  1125. self.assertRaises(OverflowError, fromHex, '-0X1.fffffffffffff9p1023')
  1126. self.assertRaises(OverflowError, fromHex, '0X1.fffffffffffff8p1023')
  1127. self.assertRaises(OverflowError, fromHex, '+0x3.fffffffffffffp1022')
  1128. self.assertRaises(OverflowError, fromHex, '0x3fffffffffffffp+970')
  1129. self.assertRaises(OverflowError, fromHex, '0x10000000000000000p960')
  1130. self.assertRaises(OverflowError, fromHex, '-0Xffffffffffffffffp960')
  1131. # ...and those that round to +-max float
  1132. self.identical(fromHex('+0x1.fffffffffffffp+1023'), MAX)
  1133. self.identical(fromHex('-0X1.fffffffffffff7p1023'), -MAX)
  1134. self.identical(fromHex('0X1.fffffffffffff7fffffffffffffp1023'), MAX)
  1135. # zeros
  1136. self.identical(fromHex('0x0p0'), 0.0)
  1137. self.identical(fromHex('0x0p1000'), 0.0)
  1138. self.identical(fromHex('-0x0p1023'), -0.0)
  1139. self.identical(fromHex('0X0p1024'), 0.0)
  1140. self.identical(fromHex('-0x0p1025'), -0.0)
  1141. self.identical(fromHex('0X0p2000'), 0.0)
  1142. self.identical(fromHex('0x0p123456789123456789'), 0.0)
  1143. self.identical(fromHex('-0X0p-0'), -0.0)
  1144. self.identical(fromHex('-0X0p-1000'), -0.0)
  1145. self.identical(fromHex('0x0p-1023'), 0.0)
  1146. self.identical(fromHex('-0X0p-1024'), -0.0)
  1147. self.identical(fromHex('-0x0p-1025'), -0.0)
  1148. self.identical(fromHex('-0x0p-1072'), -0.0)
  1149. self.identical(fromHex('0X0p-1073'), 0.0)
  1150. self.identical(fromHex('-0x0p-1074'), -0.0)
  1151. self.identical(fromHex('0x0p-1075'), 0.0)
  1152. self.identical(fromHex('0X0p-1076'), 0.0)
  1153. self.identical(fromHex('-0X0p-2000'), -0.0)
  1154. self.identical(fromHex('-0x0p-123456789123456789'), -0.0)
  1155. # values that should underflow to 0
  1156. self.identical(fromHex('0X1p-1075'), 0.0)
  1157. self.identical(fromHex('-0X1p-1075'), -0.0)
  1158. self.identical(fromHex('-0x1p-123456789123456789'), -0.0)
  1159. self.identical(fromHex('0x1.00000000000000001p-1075'), TINY)
  1160. self.identical(fromHex('-0x1.1p-1075'), -TINY)
  1161. self.identical(fromHex('0x1.fffffffffffffffffp-1075'), TINY)
  1162. # check round-half-even is working correctly near 0 ...
  1163. self.identical(fromHex('0x1p-1076'), 0.0)
  1164. self.identical(fromHex('0X2p-1076'), 0.0)
  1165. self.identical(fromHex('0X3p-1076'), TINY)
  1166. self.identical(fromHex('0x4p-1076'), TINY)
  1167. self.identical(fromHex('0X5p-1076'), TINY)
  1168. self.identical(fromHex('0X6p-1076'), 2*TINY)
  1169. self.identical(fromHex('0x7p-1076'), 2*TINY)
  1170. self.identical(fromHex('0X8p-1076'), 2*TINY)
  1171. self.identical(fromHex('0X9p-1076'), 2*TINY)
  1172. self.identical(fromHex('0xap-1076'), 2*TINY)
  1173. self.identical(fromHex('0Xbp-1076'), 3*TINY)
  1174. self.identical(fromHex('0xcp-1076'), 3*TINY)
  1175. self.identical(fromHex('0Xdp-1076'), 3*TINY)
  1176. self.identical(fromHex('0Xep-1076'), 4*TINY)
  1177. self.identical(fromHex('0xfp-1076'), 4*TINY)
  1178. self.identical(fromHex('0x10p-1076'), 4*TINY)
  1179. self.identical(fromHex('-0x1p-1076'), -0.0)
  1180. self.identical(fromHex('-0X2p-1076'), -0.0)
  1181. self.identical(fromHex('-0x3p-1076'), -TINY)
  1182. self.identical(fromHex('-0X4p-1076'), -TINY)
  1183. self.identical(fromHex('-0x5p-1076'), -TINY)
  1184. self.identical(fromHex('-0x6p-1076'), -2*TINY)
  1185. self.identical(fromHex('-0X7p-1076'), -2*TINY)
  1186. self.identical(fromHex('-0X8p-1076'), -2*TINY)
  1187. self.identical(fromHex('-0X9p-1076'), -2*TINY)
  1188. self.identical(fromHex('-0Xap-1076'), -2*TINY)
  1189. self.identical(fromHex('-0xbp-1076'), -3*TINY)
  1190. self.identical(fromHex('-0xcp-1076'), -3*TINY)
  1191. self.identical(fromHex('-0Xdp-1076'), -3*TINY)
  1192. self.identical(fromHex('-0xep-1076'), -4*TINY)
  1193. self.identical(fromHex('-0Xfp-1076'), -4*TINY)
  1194. self.identical(fromHex('-0X10p-1076'), -4*TINY)
  1195. # ... and near MIN ...
  1196. self.identical(fromHex('0x0.ffffffffffffd6p-1022'), MIN-3*TINY)
  1197. self.identical(fromHex('0x0.ffffffffffffd8p-1022'), MIN-2*TINY)
  1198. self.identical(fromHex('0x0.ffffffffffffdap-1022'), MIN-2*TINY)
  1199. self.identical(fromHex('0x0.ffffffffffffdcp-1022'), MIN-2*TINY)
  1200. self.identical(fromHex('0x0.ffffffffffffdep-1022'), MIN-2*TINY)
  1201. self.identical(fromHex('0x0.ffffffffffffe0p-1022'), MIN-2*TINY)
  1202. self.identical(fromHex('0x0.ffffffffffffe2p-1022'), MIN-2*TINY)
  1203. self.identical(fromHex('0x0.ffffffffffffe4p-1022'), MIN-2*TINY)
  1204. self.identical(fromHex('0x0.ffffffffffffe6p-1022'), MIN-2*TINY)
  1205. self.identical(fromHex('0x0.ffffffffffffe8p-1022'), MIN-2*TINY)
  1206. self.identical(fromHex('0x0.ffffffffffffeap-1022'), MIN-TINY)
  1207. self.identical(fromHex('0x0.ffffffffffffecp-1022'), MIN-TINY)
  1208. self.identical(fromHex('0x0.ffffffffffffeep-1022'), MIN-TINY)
  1209. self.identical(fromHex('0x0.fffffffffffff0p-1022'), MIN-TINY)
  1210. self.identical(fromHex('0x0.fffffffffffff2p-1022'), MIN-TINY)
  1211. self.identical(fromHex('0x0.fffffffffffff4p-1022'), MIN-TINY)
  1212. self.identical(fromHex('0x0.fffffffffffff6p-1022'), MIN-TINY)
  1213. self.identical(fromHex('0x0.fffffffffffff8p-1022'), MIN)
  1214. self.identical(fromHex('0x0.fffffffffffffap-1022'), MIN)
  1215. self.identical(fromHex('0x0.fffffffffffffcp-1022'), MIN)
  1216. self.identical(fromHex('0x0.fffffffffffffep-1022'), MIN)
  1217. self.identical(fromHex('0x1.00000000000000p-1022'), MIN)
  1218. self.identical(fromHex('0x1.00000000000002p-1022'), MIN)
  1219. self.identical(fromHex('0x1.00000000000004p-1022'), MIN)
  1220. self.identical(fromHex('0x1.00000000000006p-1022'), MIN)
  1221. self.identical(fromHex('0x1.00000000000008p-1022'), MIN)
  1222. self.identical(fromHex('0x1.0000000000000ap-1022'), MIN+TINY)
  1223. self.identical(fromHex('0x1.0000000000000cp-1022'), MIN+TINY)
  1224. self.identical(fromHex('0x1.0000000000000ep-1022'), MIN+TINY)
  1225. self.identical(fromHex('0x1.00000000000010p-1022'), MIN+TINY)
  1226. self.identical(fromHex('0x1.00000000000012p-1022'), MIN+TINY)
  1227. self.identical(fromHex('0x1.00000000000014p-1022'), MIN+TINY)
  1228. self.identical(fromHex('0x1.00000000000016p-1022'), MIN+TINY)
  1229. self.identical(fromHex('0x1.00000000000018p-1022'), MIN+2*TINY)
  1230. # ... and near 1.0.
  1231. self.identical(fromHex('0x0.fffffffffffff0p0'), 1.0-EPS)
  1232. self.identical(fromHex('0x0.fffffffffffff1p0'), 1.0-EPS)
  1233. self.identical(fromHex('0X0.fffffffffffff2p0'), 1.0-EPS)
  1234. self.identical(fromHex('0x0.fffffffffffff3p0'), 1.0-EPS)
  1235. self.identical(fromHex('0X0.fffffffffffff4p0'), 1.0-EPS)
  1236. self.identical(fromHex('0X0.fffffffffffff5p0'), 1.0-EPS/2)
  1237. self.identical(fromHex('0X0.fffffffffffff6p0'), 1.0-EPS/2)
  1238. self.identical(fromHex('0x0.fffffffffffff7p0'), 1.0-EPS/2)
  1239. self.identical(fromHex('0x0.fffffffffffff8p0'), 1.0-EPS/2)
  1240. self.identical(fromHex('0X0.fffffffffffff9p0'), 1.0-EPS/2)
  1241. self.identical(fromHex('0X0.fffffffffffffap0'), 1.0-EPS/2)
  1242. self.identical(fromHex('0x0.fffffffffffffbp0'), 1.0-EPS/2)
  1243. self.identical(fromHex('0X0.fffffffffffffcp0'), 1.0)
  1244. self.identical(fromHex('0x0.fffffffffffffdp0'), 1.0)
  1245. self.identical(fromHex('0X0.fffffffffffffep0'), 1.0)
  1246. self.identical(fromHex('0x0.ffffffffffffffp0'), 1.0)
  1247. self.identical(fromHex('0X1.00000000000000p0'), 1.0)
  1248. self.identical(fromHex('0X1.00000000000001p0'), 1.0)
  1249. self.identical(fromHex('0x1.00000000000002p0'), 1.0)
  1250. self.identical(fromHex('0X1.00000000000003p0'), 1.0)
  1251. self.identical(fromHex('0x1.00000000000004p0'), 1.0)
  1252. self.identical(fromHex('0X1.00000000000005p0'), 1.0)
  1253. self.identical(fromHex('0X1.00000000000006p0'), 1.0)
  1254. self.identical(fromHex('0X1.00000000000007p0'), 1.0)
  1255. self.identical(fromHex('0x1.00000000000007ffffffffffffffffffffp0'),
  1256. 1.0)
  1257. self.identical(fromHex('0x1.00000000000008p0'), 1.0)
  1258. self.identical(fromHex('0x1.00000000000008000000000000000001p0'),
  1259. 1+EPS)
  1260. self.identical(fromHex('0X1.00000000000009p0'), 1.0+EPS)
  1261. self.identical(fromHex('0x1.0000000000000ap0'), 1.0+EPS)
  1262. self.identical(fromHex('0x1.0000000000000bp0'), 1.0+EPS)
  1263. self.identical(fromHex('0X1.0000000000000cp0'), 1.0+EPS)
  1264. self.identical(fromHex('0x1.0000000000000dp0'), 1.0+EPS)
  1265. self.identical(fromHex('0x1.0000000000000ep0'), 1.0+EPS)
  1266. self.identical(fromHex('0X1.0000000000000fp0'), 1.0+EPS)
  1267. self.identical(fromHex('0x1.00000000000010p0'), 1.0+EPS)
  1268. self.identical(fromHex('0X1.00000000000011p0'), 1.0+EPS)
  1269. self.identical(fromHex('0x1.00000000000012p0'), 1.0+EPS)
  1270. self.identical(fromHex('0X1.00000000000013p0'), 1.0+EPS)
  1271. self.identical(fromHex('0X1.00000000000014p0'), 1.0+EPS)
  1272. self.identical(fromHex('0x1.00000000000015p0'), 1.0+EPS)
  1273. self.identical(fromHex('0x1.00000000000016p0'), 1.0+EPS)
  1274. self.identical(fromHex('0X1.00000000000017p0'), 1.0+EPS)
  1275. self.identical(fromHex('0x1.00000000000017ffffffffffffffffffffp0'),
  1276. 1.0+EPS)
  1277. self.identical(fromHex('0x1.00000000000018p0'), 1.0+2*EPS)
  1278. self.identical(fromHex('0X1.00000000000018000000000000000001p0'),
  1279. 1.0+2*EPS)
  1280. self.identical(fromHex('0x1.00000000000019p0'), 1.0+2*EPS)
  1281. self.identical(fromHex('0X1.0000000000001ap0'), 1.0+2*EPS)
  1282. self.identical(fromHex('0X1.0000000000001bp0'), 1.0+2*EPS)
  1283. self.identical(fromHex('0x1.0000000000001cp0'), 1.0+2*EPS)
  1284. self.identical(fromHex('0x1.0000000000001dp0'), 1.0+2*EPS)
  1285. self.identical(fromHex('0x1.0000000000001ep0'), 1.0+2*EPS)
  1286. self.identical(fromHex('0X1.0000000000001fp0'), 1.0+2*EPS)
  1287. self.identical(fromHex('0x1.00000000000020p0'), 1.0+2*EPS)
  1288. # Regression test for a corner-case bug reported in b.p.o. 44954
  1289. self.identical(fromHex('0x.8p-1074'), 0.0)
  1290. self.identical(fromHex('0x.80p-1074'), 0.0)
  1291. self.identical(fromHex('0x.81p-1074'), TINY)
  1292. self.identical(fromHex('0x8p-1078'), 0.0)
  1293. self.identical(fromHex('0x8.0p-1078'), 0.0)
  1294. self.identical(fromHex('0x8.1p-1078'), TINY)
  1295. self.identical(fromHex('0x80p-1082'), 0.0)
  1296. self.identical(fromHex('0x81p-1082'), TINY)
  1297. self.identical(fromHex('.8p-1074'), 0.0)
  1298. self.identical(fromHex('8p-1078'), 0.0)
  1299. self.identical(fromHex('-.8p-1074'), -0.0)
  1300. self.identical(fromHex('+8p-1078'), 0.0)
  1301. def test_roundtrip(self):
  1302. def roundtrip(x):
  1303. return fromHex(toHex(x))
  1304. for x in [NAN, INF, self.MAX, self.MIN, self.MIN-self.TINY, self.TINY, 0.0]:
  1305. self.identical(x, roundtrip(x))
  1306. self.identical(-x, roundtrip(-x))
  1307. # fromHex(toHex(x)) should exactly recover x, for any non-NaN float x.
  1308. import random
  1309. for i in range(10000):
  1310. e = random.randrange(-1200, 1200)
  1311. m = random.random()
  1312. s = random.choice([1.0, -1.0])
  1313. try:
  1314. x = s*ldexp(m, e)
  1315. except OverflowError:
  1316. pass
  1317. else:
  1318. self.identical(x, fromHex(toHex(x)))
  1319. def test_subclass(self):
  1320. class F(float):
  1321. def __new__(cls, value):
  1322. return float.__new__(cls, value + 1)
  1323. f = F.fromhex((1.5).hex())
  1324. self.assertIs(type(f), F)
  1325. self.assertEqual(f, 2.5)
  1326. class F2(float):
  1327. def __init__(self, value):
  1328. self.foo = 'bar'
  1329. f = F2.fromhex((1.5).hex())
  1330. self.assertIs(type(f), F2)
  1331. self.assertEqual(f, 1.5)
  1332. self.assertEqual(getattr(f, 'foo', 'none'), 'bar')
  1333. # Test PyFloat_Pack2(), PyFloat_Pack4() and PyFloat_Pack8()
  1334. # Test PyFloat_Unpack2(), PyFloat_Unpack4() and PyFloat_Unpack8()
  1335. BIG_ENDIAN = 0
  1336. LITTLE_ENDIAN = 1
  1337. EPSILON = {
  1338. 2: 2.0 ** -11, # binary16
  1339. 4: 2.0 ** -24, # binary32
  1340. 8: 2.0 ** -53, # binary64
  1341. }
  1342. @unittest.skipIf(_testcapi is None, 'needs _testcapi')
  1343. class PackTests(unittest.TestCase):
  1344. def test_pack(self):
  1345. self.assertEqual(_testcapi.float_pack(2, 1.5, BIG_ENDIAN),
  1346. b'>\x00')
  1347. self.assertEqual(_testcapi.float_pack(4, 1.5, BIG_ENDIAN),
  1348. b'?\xc0\x00\x00')
  1349. self.assertEqual(_testcapi.float_pack(8, 1.5, BIG_ENDIAN),
  1350. b'?\xf8\x00\x00\x00\x00\x00\x00')
  1351. self.assertEqual(_testcapi.float_pack(2, 1.5, LITTLE_ENDIAN),
  1352. b'\x00>')
  1353. self.assertEqual(_testcapi.float_pack(4, 1.5, LITTLE_ENDIAN),
  1354. b'\x00\x00\xc0?')
  1355. self.assertEqual(_testcapi.float_pack(8, 1.5, LITTLE_ENDIAN),
  1356. b'\x00\x00\x00\x00\x00\x00\xf8?')
  1357. def test_unpack(self):
  1358. self.assertEqual(_testcapi.float_unpack(b'>\x00', BIG_ENDIAN),
  1359. 1.5)
  1360. self.assertEqual(_testcapi.float_unpack(b'?\xc0\x00\x00', BIG_ENDIAN),
  1361. 1.5)
  1362. self.assertEqual(_testcapi.float_unpack(b'?\xf8\x00\x00\x00\x00\x00\x00', BIG_ENDIAN),
  1363. 1.5)
  1364. self.assertEqual(_testcapi.float_unpack(b'\x00>', LITTLE_ENDIAN),
  1365. 1.5)
  1366. self.assertEqual(_testcapi.float_unpack(b'\x00\x00\xc0?', LITTLE_ENDIAN),
  1367. 1.5)
  1368. self.assertEqual(_testcapi.float_unpack(b'\x00\x00\x00\x00\x00\x00\xf8?', LITTLE_ENDIAN),
  1369. 1.5)
  1370. def test_roundtrip(self):
  1371. large = 2.0 ** 100
  1372. values = [1.0, 1.5, large, 1.0/7, math.pi]
  1373. if HAVE_IEEE_754:
  1374. values.extend((INF, NAN))
  1375. for value in values:
  1376. for size in (2, 4, 8,):
  1377. if size == 2 and value == large:
  1378. # too large for 16-bit float
  1379. continue
  1380. rel_tol = EPSILON[size]
  1381. for endian in (BIG_ENDIAN, LITTLE_ENDIAN):
  1382. with self.subTest(value=value, size=size, endian=endian):
  1383. data = _testcapi.float_pack(size, value, endian)
  1384. value2 = _testcapi.float_unpack(data, endian)
  1385. if isnan(value):
  1386. self.assertTrue(isnan(value2), (value, value2))
  1387. elif size < 8:
  1388. self.assertTrue(math.isclose(value2, value, rel_tol=rel_tol),
  1389. (value, value2))
  1390. else:
  1391. self.assertEqual(value2, value)
  1392. if __name__ == '__main__':
  1393. unittest.main()