float4.sql 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354
  1. --
  2. -- FLOAT4
  3. --
  4. CREATE TABLE FLOAT4_TBL (f1 float4);
  5. INSERT INTO FLOAT4_TBL(f1) VALUES (' 0.0');
  6. INSERT INTO FLOAT4_TBL(f1) VALUES ('1004.30 ');
  7. INSERT INTO FLOAT4_TBL(f1) VALUES (' -34.84 ');
  8. INSERT INTO FLOAT4_TBL(f1) VALUES ('1.2345678901234e+20');
  9. INSERT INTO FLOAT4_TBL(f1) VALUES ('1.2345678901234e-20');
  10. -- test for over and under flow
  11. INSERT INTO FLOAT4_TBL(f1) VALUES ('10e70');
  12. INSERT INTO FLOAT4_TBL(f1) VALUES ('-10e70');
  13. INSERT INTO FLOAT4_TBL(f1) VALUES ('10e-70');
  14. INSERT INTO FLOAT4_TBL(f1) VALUES ('-10e-70');
  15. INSERT INTO FLOAT4_TBL(f1) VALUES ('10e70'::float8);
  16. INSERT INTO FLOAT4_TBL(f1) VALUES ('-10e70'::float8);
  17. INSERT INTO FLOAT4_TBL(f1) VALUES ('10e-70'::float8);
  18. INSERT INTO FLOAT4_TBL(f1) VALUES ('-10e-70'::float8);
  19. INSERT INTO FLOAT4_TBL(f1) VALUES ('10e400');
  20. INSERT INTO FLOAT4_TBL(f1) VALUES ('-10e400');
  21. INSERT INTO FLOAT4_TBL(f1) VALUES ('10e-400');
  22. INSERT INTO FLOAT4_TBL(f1) VALUES ('-10e-400');
  23. -- bad input
  24. INSERT INTO FLOAT4_TBL(f1) VALUES ('');
  25. INSERT INTO FLOAT4_TBL(f1) VALUES (' ');
  26. INSERT INTO FLOAT4_TBL(f1) VALUES ('xyz');
  27. INSERT INTO FLOAT4_TBL(f1) VALUES ('5.0.0');
  28. INSERT INTO FLOAT4_TBL(f1) VALUES ('5 . 0');
  29. INSERT INTO FLOAT4_TBL(f1) VALUES ('5. 0');
  30. INSERT INTO FLOAT4_TBL(f1) VALUES (' - 3.0');
  31. INSERT INTO FLOAT4_TBL(f1) VALUES ('123 5');
  32. -- special inputs
  33. SELECT 'NaN'::float4;
  34. SELECT 'nan'::float4;
  35. SELECT ' NAN '::float4;
  36. SELECT 'infinity'::float4;
  37. SELECT ' -INFINiTY '::float4;
  38. -- bad special inputs
  39. SELECT 'N A N'::float4;
  40. SELECT 'NaN x'::float4;
  41. SELECT ' INFINITY x'::float4;
  42. SELECT 'Infinity'::float4 + 100.0;
  43. SELECT 'Infinity'::float4 / 'Infinity'::float4;
  44. SELECT '42'::float4 / 'Infinity'::float4;
  45. SELECT 'nan'::float4 / 'nan'::float4;
  46. SELECT 'nan'::float4 / '0'::float4;
  47. SELECT 'nan'::numeric::float4;
  48. SELECT * FROM FLOAT4_TBL;
  49. SELECT f.* FROM FLOAT4_TBL f WHERE f.f1 <> '1004.3';
  50. SELECT f.* FROM FLOAT4_TBL f WHERE f.f1 = '1004.3';
  51. SELECT f.* FROM FLOAT4_TBL f WHERE '1004.3' > f.f1;
  52. SELECT f.* FROM FLOAT4_TBL f WHERE f.f1 < '1004.3';
  53. SELECT f.* FROM FLOAT4_TBL f WHERE '1004.3' >= f.f1;
  54. SELECT f.* FROM FLOAT4_TBL f WHERE f.f1 <= '1004.3';
  55. SELECT f.f1, f.f1 * '-10' AS x FROM FLOAT4_TBL f
  56. WHERE f.f1 > '0.0';
  57. SELECT f.f1, f.f1 + '-10' AS x FROM FLOAT4_TBL f
  58. WHERE f.f1 > '0.0';
  59. SELECT f.f1, f.f1 / '-10' AS x FROM FLOAT4_TBL f
  60. WHERE f.f1 > '0.0';
  61. SELECT f.f1, f.f1 - '-10' AS x FROM FLOAT4_TBL f
  62. WHERE f.f1 > '0.0';
  63. -- test divide by zero
  64. SELECT f.f1 / '0.0' from FLOAT4_TBL f;
  65. SELECT * FROM FLOAT4_TBL;
  66. -- test the unary float4abs operator
  67. SELECT f.f1, @f.f1 AS abs_f1 FROM FLOAT4_TBL f;
  68. UPDATE FLOAT4_TBL
  69. SET f1 = FLOAT4_TBL.f1 * '-1'
  70. WHERE FLOAT4_TBL.f1 > '0.0';
  71. SELECT * FROM FLOAT4_TBL;
  72. -- test edge-case coercions to integer
  73. SELECT '32767.4'::float4::int2;
  74. SELECT '32767.6'::float4::int2;
  75. SELECT '-32768.4'::float4::int2;
  76. SELECT '-32768.6'::float4::int2;
  77. SELECT '2147483520'::float4::int4;
  78. SELECT '2147483647'::float4::int4;
  79. SELECT '-2147483648.5'::float4::int4;
  80. SELECT '-2147483900'::float4::int4;
  81. SELECT '9223369837831520256'::float4::int8;
  82. SELECT '9223372036854775807'::float4::int8;
  83. SELECT '-9223372036854775808.5'::float4::int8;
  84. SELECT '-9223380000000000000'::float4::int8;
  85. -- Test for correct input rounding in edge cases.
  86. -- These lists are from Paxson 1991, excluding subnormals and
  87. -- inputs of over 9 sig. digits.
  88. SELECT float4send('5e-20'::float4);
  89. SELECT float4send('67e14'::float4);
  90. SELECT float4send('985e15'::float4);
  91. SELECT float4send('55895e-16'::float4);
  92. SELECT float4send('7038531e-32'::float4);
  93. SELECT float4send('702990899e-20'::float4);
  94. SELECT float4send('3e-23'::float4);
  95. SELECT float4send('57e18'::float4);
  96. SELECT float4send('789e-35'::float4);
  97. SELECT float4send('2539e-18'::float4);
  98. SELECT float4send('76173e28'::float4);
  99. SELECT float4send('887745e-11'::float4);
  100. SELECT float4send('5382571e-37'::float4);
  101. SELECT float4send('82381273e-35'::float4);
  102. SELECT float4send('750486563e-38'::float4);
  103. -- Test that the smallest possible normalized input value inputs
  104. -- correctly, either in 9-significant-digit or shortest-decimal
  105. -- format.
  106. --
  107. -- exact val is 1.1754943508...
  108. -- shortest val is 1.1754944000
  109. -- midpoint to next val is 1.1754944208...
  110. SELECT float4send('1.17549435e-38'::float4);
  111. SELECT float4send('1.1754944e-38'::float4);
  112. -- test output (and round-trip safety) of various values.
  113. -- To ensure we're testing what we think we're testing, start with
  114. -- float values specified by bit patterns (as a useful side effect,
  115. -- this means we'll fail on non-IEEE platforms).
  116. create type xfloat4;
  117. create function xfloat4in(cstring) returns xfloat4 immutable strict
  118. language internal as 'int4in';
  119. create function xfloat4out(xfloat4) returns cstring immutable strict
  120. language internal as 'int4out';
  121. create type xfloat4 (input = xfloat4in, output = xfloat4out, like = float4);
  122. create cast (xfloat4 as float4) without function;
  123. create cast (float4 as xfloat4) without function;
  124. create cast (xfloat4 as integer) without function;
  125. create cast (integer as xfloat4) without function;
  126. -- float4: seeeeeee emmmmmmm mmmmmmmm mmmmmmmm
  127. -- we don't care to assume the platform's strtod() handles subnormals
  128. -- correctly; those are "use at your own risk". However we do test
  129. -- subnormal outputs, since those are under our control.
  130. with testdata(bits) as (values
  131. -- small subnormals
  132. (x'00000001'),
  133. (x'00000002'), (x'00000003'),
  134. (x'00000010'), (x'00000011'), (x'00000100'), (x'00000101'),
  135. (x'00004000'), (x'00004001'), (x'00080000'), (x'00080001'),
  136. -- stress values
  137. (x'0053c4f4'), -- 7693e-42
  138. (x'006c85c4'), -- 996622e-44
  139. (x'0041ca76'), -- 60419369e-46
  140. (x'004b7678'), -- 6930161142e-48
  141. -- taken from upstream testsuite
  142. (x'00000007'),
  143. (x'00424fe2'),
  144. -- borderline between subnormal and normal
  145. (x'007ffff0'), (x'007ffff1'), (x'007ffffe'), (x'007fffff'))
  146. select float4send(flt) as ibits,
  147. flt
  148. from (select bits::integer::xfloat4::float4 as flt
  149. from testdata
  150. offset 0) s;
  151. with testdata(bits) as (values
  152. (x'00000000'),
  153. -- smallest normal values
  154. (x'00800000'), (x'00800001'), (x'00800004'), (x'00800005'),
  155. (x'00800006'),
  156. -- small normal values chosen for short vs. long output
  157. (x'008002f1'), (x'008002f2'), (x'008002f3'),
  158. (x'00800e17'), (x'00800e18'), (x'00800e19'),
  159. -- assorted values (random mantissae)
  160. (x'01000001'), (x'01102843'), (x'01a52c98'),
  161. (x'0219c229'), (x'02e4464d'), (x'037343c1'), (x'03a91b36'),
  162. (x'047ada65'), (x'0496fe87'), (x'0550844f'), (x'05999da3'),
  163. (x'060ea5e2'), (x'06e63c45'), (x'07f1e548'), (x'0fc5282b'),
  164. (x'1f850283'), (x'2874a9d6'),
  165. -- values around 5e-08
  166. (x'3356bf94'), (x'3356bf95'), (x'3356bf96'),
  167. -- around 1e-07
  168. (x'33d6bf94'), (x'33d6bf95'), (x'33d6bf96'),
  169. -- around 3e-07 .. 1e-04
  170. (x'34a10faf'), (x'34a10fb0'), (x'34a10fb1'),
  171. (x'350637bc'), (x'350637bd'), (x'350637be'),
  172. (x'35719786'), (x'35719787'), (x'35719788'),
  173. (x'358637bc'), (x'358637bd'), (x'358637be'),
  174. (x'36a7c5ab'), (x'36a7c5ac'), (x'36a7c5ad'),
  175. (x'3727c5ab'), (x'3727c5ac'), (x'3727c5ad'),
  176. -- format crossover at 1e-04
  177. (x'38d1b714'), (x'38d1b715'), (x'38d1b716'),
  178. (x'38d1b717'), (x'38d1b718'), (x'38d1b719'),
  179. (x'38d1b71a'), (x'38d1b71b'), (x'38d1b71c'),
  180. (x'38d1b71d'),
  181. --
  182. (x'38dffffe'), (x'38dfffff'), (x'38e00000'),
  183. (x'38efffff'), (x'38f00000'), (x'38f00001'),
  184. (x'3a83126e'), (x'3a83126f'), (x'3a831270'),
  185. (x'3c23d709'), (x'3c23d70a'), (x'3c23d70b'),
  186. (x'3dcccccc'), (x'3dcccccd'), (x'3dccccce'),
  187. -- chosen to need 9 digits for 3dcccd70
  188. (x'3dcccd6f'), (x'3dcccd70'), (x'3dcccd71'),
  189. --
  190. (x'3effffff'), (x'3f000000'), (x'3f000001'),
  191. (x'3f333332'), (x'3f333333'), (x'3f333334'),
  192. -- approach 1.0 with increasing numbers of 9s
  193. (x'3f666665'), (x'3f666666'), (x'3f666667'),
  194. (x'3f7d70a3'), (x'3f7d70a4'), (x'3f7d70a5'),
  195. (x'3f7fbe76'), (x'3f7fbe77'), (x'3f7fbe78'),
  196. (x'3f7ff971'), (x'3f7ff972'), (x'3f7ff973'),
  197. (x'3f7fff57'), (x'3f7fff58'), (x'3f7fff59'),
  198. (x'3f7fffee'), (x'3f7fffef'),
  199. -- values very close to 1
  200. (x'3f7ffff0'), (x'3f7ffff1'), (x'3f7ffff2'),
  201. (x'3f7ffff3'), (x'3f7ffff4'), (x'3f7ffff5'),
  202. (x'3f7ffff6'), (x'3f7ffff7'), (x'3f7ffff8'),
  203. (x'3f7ffff9'), (x'3f7ffffa'), (x'3f7ffffb'),
  204. (x'3f7ffffc'), (x'3f7ffffd'), (x'3f7ffffe'),
  205. (x'3f7fffff'),
  206. (x'3f800000'),
  207. (x'3f800001'), (x'3f800002'), (x'3f800003'),
  208. (x'3f800004'), (x'3f800005'), (x'3f800006'),
  209. (x'3f800007'), (x'3f800008'), (x'3f800009'),
  210. -- values 1 to 1.1
  211. (x'3f80000f'), (x'3f800010'), (x'3f800011'),
  212. (x'3f800012'), (x'3f800013'), (x'3f800014'),
  213. (x'3f800017'), (x'3f800018'), (x'3f800019'),
  214. (x'3f80001a'), (x'3f80001b'), (x'3f80001c'),
  215. (x'3f800029'), (x'3f80002a'), (x'3f80002b'),
  216. (x'3f800053'), (x'3f800054'), (x'3f800055'),
  217. (x'3f800346'), (x'3f800347'), (x'3f800348'),
  218. (x'3f8020c4'), (x'3f8020c5'), (x'3f8020c6'),
  219. (x'3f8147ad'), (x'3f8147ae'), (x'3f8147af'),
  220. (x'3f8ccccc'), (x'3f8ccccd'), (x'3f8cccce'),
  221. --
  222. (x'3fc90fdb'), -- pi/2
  223. (x'402df854'), -- e
  224. (x'40490fdb'), -- pi
  225. --
  226. (x'409fffff'), (x'40a00000'), (x'40a00001'),
  227. (x'40afffff'), (x'40b00000'), (x'40b00001'),
  228. (x'411fffff'), (x'41200000'), (x'41200001'),
  229. (x'42c7ffff'), (x'42c80000'), (x'42c80001'),
  230. (x'4479ffff'), (x'447a0000'), (x'447a0001'),
  231. (x'461c3fff'), (x'461c4000'), (x'461c4001'),
  232. (x'47c34fff'), (x'47c35000'), (x'47c35001'),
  233. (x'497423ff'), (x'49742400'), (x'49742401'),
  234. (x'4b18967f'), (x'4b189680'), (x'4b189681'),
  235. (x'4cbebc1f'), (x'4cbebc20'), (x'4cbebc21'),
  236. (x'4e6e6b27'), (x'4e6e6b28'), (x'4e6e6b29'),
  237. (x'501502f8'), (x'501502f9'), (x'501502fa'),
  238. (x'51ba43b6'), (x'51ba43b7'), (x'51ba43b8'),
  239. -- stress values
  240. (x'1f6c1e4a'), -- 5e-20
  241. (x'59be6cea'), -- 67e14
  242. (x'5d5ab6c4'), -- 985e15
  243. (x'2cc4a9bd'), -- 55895e-16
  244. (x'15ae43fd'), -- 7038531e-32
  245. (x'2cf757ca'), -- 702990899e-20
  246. (x'665ba998'), -- 25933168707e13
  247. (x'743c3324'), -- 596428896559e20
  248. -- exercise fixed-point memmoves
  249. (x'47f1205a'),
  250. (x'4640e6ae'),
  251. (x'449a5225'),
  252. (x'42f6e9d5'),
  253. (x'414587dd'),
  254. (x'3f9e064b'),
  255. -- these cases come from the upstream's testsuite
  256. -- BoundaryRoundEven
  257. (x'4c000004'),
  258. (x'50061c46'),
  259. (x'510006a8'),
  260. -- ExactValueRoundEven
  261. (x'48951f84'),
  262. (x'45fd1840'),
  263. -- LotsOfTrailingZeros
  264. (x'39800000'),
  265. (x'3b200000'),
  266. (x'3b900000'),
  267. (x'3bd00000'),
  268. -- Regression
  269. (x'63800000'),
  270. (x'4b000000'),
  271. (x'4b800000'),
  272. (x'4c000001'),
  273. (x'4c800b0d'),
  274. (x'00d24584'),
  275. (x'00d90b88'),
  276. (x'45803f34'),
  277. (x'4f9f24f7'),
  278. (x'3a8722c3'),
  279. (x'5c800041'),
  280. (x'15ae43fd'),
  281. (x'5d4cccfb'),
  282. (x'4c800001'),
  283. (x'57800ed8'),
  284. (x'5f000000'),
  285. (x'700000f0'),
  286. (x'5f23e9ac'),
  287. (x'5e9502f9'),
  288. (x'5e8012b1'),
  289. (x'3c000028'),
  290. (x'60cde861'),
  291. (x'03aa2a50'),
  292. (x'43480000'),
  293. (x'4c000000'),
  294. -- LooksLikePow5
  295. (x'5D1502F9'),
  296. (x'5D9502F9'),
  297. (x'5E1502F9'),
  298. -- OutputLength
  299. (x'3f99999a'),
  300. (x'3f9d70a4'),
  301. (x'3f9df3b6'),
  302. (x'3f9e0419'),
  303. (x'3f9e0610'),
  304. (x'3f9e064b'),
  305. (x'3f9e0651'),
  306. (x'03d20cfe')
  307. )
  308. select float4send(flt) as ibits,
  309. flt,
  310. flt::text::float4 as r_flt,
  311. float4send(flt::text::float4) as obits,
  312. float4send(flt::text::float4) = float4send(flt) as correct
  313. from (select bits::integer::xfloat4::float4 as flt
  314. from testdata
  315. offset 0) s;
  316. -- clean up, lest opr_sanity complain
  317. drop type xfloat4 cascade;