float4.out 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434
  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. ERROR: "10e70" is out of range for type real
  13. LINE 1: INSERT INTO FLOAT4_TBL(f1) VALUES ('10e70');
  14. ^
  15. INSERT INTO FLOAT4_TBL(f1) VALUES ('-10e70');
  16. ERROR: "-10e70" is out of range for type real
  17. LINE 1: INSERT INTO FLOAT4_TBL(f1) VALUES ('-10e70');
  18. ^
  19. INSERT INTO FLOAT4_TBL(f1) VALUES ('10e-70');
  20. ERROR: "10e-70" is out of range for type real
  21. LINE 1: INSERT INTO FLOAT4_TBL(f1) VALUES ('10e-70');
  22. ^
  23. INSERT INTO FLOAT4_TBL(f1) VALUES ('-10e-70');
  24. ERROR: "-10e-70" is out of range for type real
  25. LINE 1: INSERT INTO FLOAT4_TBL(f1) VALUES ('-10e-70');
  26. ^
  27. INSERT INTO FLOAT4_TBL(f1) VALUES ('10e70'::float8);
  28. ERROR: value out of range: overflow
  29. INSERT INTO FLOAT4_TBL(f1) VALUES ('-10e70'::float8);
  30. ERROR: value out of range: overflow
  31. INSERT INTO FLOAT4_TBL(f1) VALUES ('10e-70'::float8);
  32. ERROR: value out of range: underflow
  33. INSERT INTO FLOAT4_TBL(f1) VALUES ('-10e-70'::float8);
  34. ERROR: value out of range: underflow
  35. INSERT INTO FLOAT4_TBL(f1) VALUES ('10e400');
  36. ERROR: "10e400" is out of range for type real
  37. LINE 1: INSERT INTO FLOAT4_TBL(f1) VALUES ('10e400');
  38. ^
  39. INSERT INTO FLOAT4_TBL(f1) VALUES ('-10e400');
  40. ERROR: "-10e400" is out of range for type real
  41. LINE 1: INSERT INTO FLOAT4_TBL(f1) VALUES ('-10e400');
  42. ^
  43. INSERT INTO FLOAT4_TBL(f1) VALUES ('10e-400');
  44. ERROR: "10e-400" is out of range for type real
  45. LINE 1: INSERT INTO FLOAT4_TBL(f1) VALUES ('10e-400');
  46. ^
  47. INSERT INTO FLOAT4_TBL(f1) VALUES ('-10e-400');
  48. ERROR: "-10e-400" is out of range for type real
  49. LINE 1: INSERT INTO FLOAT4_TBL(f1) VALUES ('-10e-400');
  50. ^
  51. -- bad input
  52. INSERT INTO FLOAT4_TBL(f1) VALUES ('');
  53. ERROR: invalid input syntax for type real: ""
  54. LINE 1: INSERT INTO FLOAT4_TBL(f1) VALUES ('');
  55. ^
  56. INSERT INTO FLOAT4_TBL(f1) VALUES (' ');
  57. ERROR: invalid input syntax for type real: " "
  58. LINE 1: INSERT INTO FLOAT4_TBL(f1) VALUES (' ');
  59. ^
  60. INSERT INTO FLOAT4_TBL(f1) VALUES ('xyz');
  61. ERROR: invalid input syntax for type real: "xyz"
  62. LINE 1: INSERT INTO FLOAT4_TBL(f1) VALUES ('xyz');
  63. ^
  64. INSERT INTO FLOAT4_TBL(f1) VALUES ('5.0.0');
  65. ERROR: invalid input syntax for type real: "5.0.0"
  66. LINE 1: INSERT INTO FLOAT4_TBL(f1) VALUES ('5.0.0');
  67. ^
  68. INSERT INTO FLOAT4_TBL(f1) VALUES ('5 . 0');
  69. ERROR: invalid input syntax for type real: "5 . 0"
  70. LINE 1: INSERT INTO FLOAT4_TBL(f1) VALUES ('5 . 0');
  71. ^
  72. INSERT INTO FLOAT4_TBL(f1) VALUES ('5. 0');
  73. ERROR: invalid input syntax for type real: "5. 0"
  74. LINE 1: INSERT INTO FLOAT4_TBL(f1) VALUES ('5. 0');
  75. ^
  76. INSERT INTO FLOAT4_TBL(f1) VALUES (' - 3.0');
  77. ERROR: invalid input syntax for type real: " - 3.0"
  78. LINE 1: INSERT INTO FLOAT4_TBL(f1) VALUES (' - 3.0');
  79. ^
  80. INSERT INTO FLOAT4_TBL(f1) VALUES ('123 5');
  81. ERROR: invalid input syntax for type real: "123 5"
  82. LINE 1: INSERT INTO FLOAT4_TBL(f1) VALUES ('123 5');
  83. ^
  84. -- special inputs
  85. SELECT 'NaN'::float4;
  86. float4
  87. --------
  88. NaN
  89. (1 row)
  90. SELECT 'nan'::float4;
  91. float4
  92. --------
  93. NaN
  94. (1 row)
  95. SELECT ' NAN '::float4;
  96. float4
  97. --------
  98. NaN
  99. (1 row)
  100. SELECT 'infinity'::float4;
  101. float4
  102. ----------
  103. Infinity
  104. (1 row)
  105. SELECT ' -INFINiTY '::float4;
  106. float4
  107. -----------
  108. -Infinity
  109. (1 row)
  110. -- bad special inputs
  111. SELECT 'N A N'::float4;
  112. ERROR: invalid input syntax for type real: "N A N"
  113. LINE 1: SELECT 'N A N'::float4;
  114. ^
  115. SELECT 'NaN x'::float4;
  116. ERROR: invalid input syntax for type real: "NaN x"
  117. LINE 1: SELECT 'NaN x'::float4;
  118. ^
  119. SELECT ' INFINITY x'::float4;
  120. ERROR: invalid input syntax for type real: " INFINITY x"
  121. LINE 1: SELECT ' INFINITY x'::float4;
  122. ^
  123. SELECT 'Infinity'::float4 + 100.0;
  124. ?column?
  125. ----------
  126. Infinity
  127. (1 row)
  128. SELECT 'Infinity'::float4 / 'Infinity'::float4;
  129. ?column?
  130. ----------
  131. NaN
  132. (1 row)
  133. SELECT '42'::float4 / 'Infinity'::float4;
  134. ?column?
  135. ----------
  136. 0
  137. (1 row)
  138. SELECT 'nan'::float4 / 'nan'::float4;
  139. ?column?
  140. ----------
  141. NaN
  142. (1 row)
  143. SELECT 'nan'::float4 / '0'::float4;
  144. ?column?
  145. ----------
  146. NaN
  147. (1 row)
  148. SELECT 'nan'::numeric::float4;
  149. float4
  150. --------
  151. NaN
  152. (1 row)
  153. SELECT * FROM FLOAT4_TBL;
  154. f1
  155. ---------------
  156. 0
  157. 1004.3
  158. -34.84
  159. 1.2345679e+20
  160. 1.2345679e-20
  161. (5 rows)
  162. SELECT f.* FROM FLOAT4_TBL f WHERE f.f1 <> '1004.3';
  163. f1
  164. ---------------
  165. 0
  166. -34.84
  167. 1.2345679e+20
  168. 1.2345679e-20
  169. (4 rows)
  170. SELECT f.* FROM FLOAT4_TBL f WHERE f.f1 = '1004.3';
  171. f1
  172. --------
  173. 1004.3
  174. (1 row)
  175. SELECT f.* FROM FLOAT4_TBL f WHERE '1004.3' > f.f1;
  176. f1
  177. ---------------
  178. 0
  179. -34.84
  180. 1.2345679e-20
  181. (3 rows)
  182. SELECT f.* FROM FLOAT4_TBL f WHERE f.f1 < '1004.3';
  183. f1
  184. ---------------
  185. 0
  186. -34.84
  187. 1.2345679e-20
  188. (3 rows)
  189. SELECT f.* FROM FLOAT4_TBL f WHERE '1004.3' >= f.f1;
  190. f1
  191. ---------------
  192. 0
  193. 1004.3
  194. -34.84
  195. 1.2345679e-20
  196. (4 rows)
  197. SELECT f.* FROM FLOAT4_TBL f WHERE f.f1 <= '1004.3';
  198. f1
  199. ---------------
  200. 0
  201. 1004.3
  202. -34.84
  203. 1.2345679e-20
  204. (4 rows)
  205. SELECT f.f1, f.f1 * '-10' AS x FROM FLOAT4_TBL f
  206. WHERE f.f1 > '0.0';
  207. f1 | x
  208. ---------------+----------------
  209. 1004.3 | -10043
  210. 1.2345679e+20 | -1.2345678e+21
  211. 1.2345679e-20 | -1.2345678e-19
  212. (3 rows)
  213. SELECT f.f1, f.f1 / '-10' AS x FROM FLOAT4_TBL f
  214. WHERE f.f1 > '0.0';
  215. f1 | x
  216. ---------------+----------------
  217. 1004.3 | -100.43
  218. 1.2345679e+20 | -1.2345679e+19
  219. 1.2345679e-20 | -1.2345679e-21
  220. (3 rows)
  221. SELECT f.f1, f.f1 - '-10' AS x FROM FLOAT4_TBL f
  222. WHERE f.f1 > '0.0';
  223. f1 | x
  224. ---------------+---------------
  225. 1004.3 | 1014.3
  226. 1.2345679e+20 | 1.2345679e+20
  227. 1.2345679e-20 | 10
  228. (3 rows)
  229. -- test divide by zero
  230. SELECT f.f1 / '0.0' from FLOAT4_TBL f;
  231. ERROR: division by zero
  232. SELECT * FROM FLOAT4_TBL;
  233. f1
  234. ---------------
  235. 0
  236. 1004.3
  237. -34.84
  238. 1.2345679e+20
  239. 1.2345679e-20
  240. (5 rows)
  241. -- test the unary float4abs operator
  242. SELECT f.f1, @f.f1 AS abs_f1 FROM FLOAT4_TBL f;
  243. f1 | abs_f1
  244. ---------------+---------------
  245. 0 | 0
  246. 1004.3 | 1004.3
  247. -34.84 | 34.84
  248. 1.2345679e+20 | 1.2345679e+20
  249. 1.2345679e-20 | 1.2345679e-20
  250. (5 rows)
  251. -- test edge-case coercions to integer
  252. SELECT '32767.4'::float4::int2;
  253. int2
  254. -------
  255. 32767
  256. (1 row)
  257. SELECT '32767.6'::float4::int2;
  258. ERROR: smallint out of range
  259. SELECT '-32768.4'::float4::int2;
  260. int2
  261. --------
  262. -32768
  263. (1 row)
  264. SELECT '-32768.6'::float4::int2;
  265. ERROR: smallint out of range
  266. SELECT '2147483520'::float4::int4;
  267. int4
  268. ------------
  269. 2147483520
  270. (1 row)
  271. SELECT '2147483647'::float4::int4;
  272. ERROR: integer out of range
  273. SELECT '-2147483648.5'::float4::int4;
  274. int4
  275. -------------
  276. -2147483648
  277. (1 row)
  278. SELECT '-2147483900'::float4::int4;
  279. ERROR: integer out of range
  280. SELECT '9223369837831520256'::float4::int8;
  281. int8
  282. ---------------------
  283. 9223369837831520256
  284. (1 row)
  285. SELECT '9223372036854775807'::float4::int8;
  286. ERROR: bigint out of range
  287. SELECT '-9223372036854775808.5'::float4::int8;
  288. int8
  289. ----------------------
  290. -9223372036854775808
  291. (1 row)
  292. SELECT '-9223380000000000000'::float4::int8;
  293. ERROR: bigint out of range
  294. -- Test for correct input rounding in edge cases.
  295. -- These lists are from Paxson 1991, excluding subnormals and
  296. -- inputs of over 9 sig. digits.
  297. SELECT float4send('5e-20'::float4);
  298. float4send
  299. ------------
  300. \x1f6c1e4a
  301. (1 row)
  302. SELECT float4send('67e14'::float4);
  303. float4send
  304. ------------
  305. \x59be6cea
  306. (1 row)
  307. SELECT float4send('985e15'::float4);
  308. float4send
  309. ------------
  310. \x5d5ab6c4
  311. (1 row)
  312. SELECT float4send('55895e-16'::float4);
  313. float4send
  314. ------------
  315. \x2cc4a9bd
  316. (1 row)
  317. SELECT float4send('7038531e-32'::float4);
  318. float4send
  319. ------------
  320. \x15ae43fd
  321. (1 row)
  322. SELECT float4send('702990899e-20'::float4);
  323. float4send
  324. ------------
  325. \x2cf757ca
  326. (1 row)
  327. SELECT float4send('3e-23'::float4);
  328. float4send
  329. ------------
  330. \x1a111234
  331. (1 row)
  332. SELECT float4send('57e18'::float4);
  333. float4send
  334. ------------
  335. \x6045c22c
  336. (1 row)
  337. SELECT float4send('789e-35'::float4);
  338. float4send
  339. ------------
  340. \x0a23de70
  341. (1 row)
  342. SELECT float4send('2539e-18'::float4);
  343. float4send
  344. ------------
  345. \x2736f449
  346. (1 row)
  347. SELECT float4send('76173e28'::float4);
  348. float4send
  349. ------------
  350. \x7616398a
  351. (1 row)
  352. SELECT float4send('887745e-11'::float4);
  353. float4send
  354. ------------
  355. \x3714f05c
  356. (1 row)
  357. SELECT float4send('5382571e-37'::float4);
  358. float4send
  359. ------------
  360. \x0d2eaca7
  361. (1 row)
  362. SELECT float4send('82381273e-35'::float4);
  363. float4send
  364. ------------
  365. \x128289d1
  366. (1 row)
  367. SELECT float4send('750486563e-38'::float4);
  368. float4send
  369. ------------
  370. \x0f18377e
  371. (1 row)
  372. -- Test that the smallest possible normalized input value inputs
  373. -- correctly, either in 9-significant-digit or shortest-decimal
  374. -- format.
  375. --
  376. -- exact val is 1.1754943508...
  377. -- shortest val is 1.1754944000
  378. -- midpoint to next val is 1.1754944208...
  379. SELECT float4send('1.17549435e-38'::float4);
  380. float4send
  381. ------------
  382. \x00800000
  383. (1 row)
  384. SELECT float4send('1.1754944e-38'::float4);
  385. float4send
  386. ------------
  387. \x00800000
  388. (1 row)