float8.out 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840
  1. --
  2. -- FLOAT8
  3. --
  4. CREATE TABLE FLOAT8_TBL(f1 float8);
  5. INSERT INTO FLOAT8_TBL(f1) VALUES (' 0.0 ');
  6. INSERT INTO FLOAT8_TBL(f1) VALUES ('1004.30 ');
  7. INSERT INTO FLOAT8_TBL(f1) VALUES (' -34.84');
  8. INSERT INTO FLOAT8_TBL(f1) VALUES ('1.2345678901234e+200');
  9. INSERT INTO FLOAT8_TBL(f1) VALUES ('1.2345678901234e-200');
  10. -- test for underflow and overflow handling
  11. SELECT '10e400'::float8;
  12. ERROR: "10e400" is out of range for type double precision
  13. LINE 1: SELECT '10e400'::float8;
  14. ^
  15. SELECT '-10e400'::float8;
  16. ERROR: "-10e400" is out of range for type double precision
  17. LINE 1: SELECT '-10e400'::float8;
  18. ^
  19. SELECT '10e-400'::float8;
  20. ERROR: "10e-400" is out of range for type double precision
  21. LINE 1: SELECT '10e-400'::float8;
  22. ^
  23. SELECT '-10e-400'::float8;
  24. ERROR: "-10e-400" is out of range for type double precision
  25. LINE 1: SELECT '-10e-400'::float8;
  26. ^
  27. -- test smallest normalized input
  28. SELECT float8send('2.2250738585072014E-308'::float8);
  29. float8send
  30. --------------------
  31. \x0010000000000000
  32. (1 row)
  33. -- bad input
  34. INSERT INTO FLOAT8_TBL(f1) VALUES ('');
  35. ERROR: invalid input syntax for type double precision: ""
  36. LINE 1: INSERT INTO FLOAT8_TBL(f1) VALUES ('');
  37. ^
  38. INSERT INTO FLOAT8_TBL(f1) VALUES (' ');
  39. ERROR: invalid input syntax for type double precision: " "
  40. LINE 1: INSERT INTO FLOAT8_TBL(f1) VALUES (' ');
  41. ^
  42. INSERT INTO FLOAT8_TBL(f1) VALUES ('xyz');
  43. ERROR: invalid input syntax for type double precision: "xyz"
  44. LINE 1: INSERT INTO FLOAT8_TBL(f1) VALUES ('xyz');
  45. ^
  46. INSERT INTO FLOAT8_TBL(f1) VALUES ('5.0.0');
  47. ERROR: invalid input syntax for type double precision: "5.0.0"
  48. LINE 1: INSERT INTO FLOAT8_TBL(f1) VALUES ('5.0.0');
  49. ^
  50. INSERT INTO FLOAT8_TBL(f1) VALUES ('5 . 0');
  51. ERROR: invalid input syntax for type double precision: "5 . 0"
  52. LINE 1: INSERT INTO FLOAT8_TBL(f1) VALUES ('5 . 0');
  53. ^
  54. INSERT INTO FLOAT8_TBL(f1) VALUES ('5. 0');
  55. ERROR: invalid input syntax for type double precision: "5. 0"
  56. LINE 1: INSERT INTO FLOAT8_TBL(f1) VALUES ('5. 0');
  57. ^
  58. INSERT INTO FLOAT8_TBL(f1) VALUES (' - 3');
  59. ERROR: invalid input syntax for type double precision: " - 3"
  60. LINE 1: INSERT INTO FLOAT8_TBL(f1) VALUES (' - 3');
  61. ^
  62. INSERT INTO FLOAT8_TBL(f1) VALUES ('123 5');
  63. ERROR: invalid input syntax for type double precision: "123 5"
  64. LINE 1: INSERT INTO FLOAT8_TBL(f1) VALUES ('123 5');
  65. ^
  66. -- special inputs
  67. SELECT 'NaN'::float8;
  68. float8
  69. --------
  70. NaN
  71. (1 row)
  72. SELECT 'nan'::float8;
  73. float8
  74. --------
  75. NaN
  76. (1 row)
  77. SELECT ' NAN '::float8;
  78. float8
  79. --------
  80. NaN
  81. (1 row)
  82. SELECT 'infinity'::float8;
  83. float8
  84. ----------
  85. Infinity
  86. (1 row)
  87. SELECT ' -INFINiTY '::float8;
  88. float8
  89. -----------
  90. -Infinity
  91. (1 row)
  92. -- bad special inputs
  93. SELECT 'N A N'::float8;
  94. ERROR: invalid input syntax for type double precision: "N A N"
  95. LINE 1: SELECT 'N A N'::float8;
  96. ^
  97. SELECT 'NaN x'::float8;
  98. ERROR: invalid input syntax for type double precision: "NaN x"
  99. LINE 1: SELECT 'NaN x'::float8;
  100. ^
  101. SELECT ' INFINITY x'::float8;
  102. ERROR: invalid input syntax for type double precision: " INFINITY x"
  103. LINE 1: SELECT ' INFINITY x'::float8;
  104. ^
  105. SELECT 'Infinity'::float8 + 100.0;
  106. ?column?
  107. ----------
  108. Infinity
  109. (1 row)
  110. SELECT 'Infinity'::float8 / 'Infinity'::float8;
  111. ?column?
  112. ----------
  113. NaN
  114. (1 row)
  115. SELECT '42'::float8 / 'Infinity'::float8;
  116. ?column?
  117. ----------
  118. 0
  119. (1 row)
  120. SELECT 'nan'::float8 / 'nan'::float8;
  121. ?column?
  122. ----------
  123. NaN
  124. (1 row)
  125. SELECT 'nan'::float8 / '0'::float8;
  126. ?column?
  127. ----------
  128. NaN
  129. (1 row)
  130. SELECT 'nan'::numeric::float8;
  131. float8
  132. --------
  133. NaN
  134. (1 row)
  135. SELECT * FROM FLOAT8_TBL;
  136. f1
  137. ----------------------
  138. 0
  139. 1004.3
  140. -34.84
  141. 1.2345678901234e+200
  142. 1.2345678901234e-200
  143. (5 rows)
  144. SELECT f.* FROM FLOAT8_TBL f WHERE f.f1 <> '1004.3';
  145. f1
  146. ----------------------
  147. 0
  148. -34.84
  149. 1.2345678901234e+200
  150. 1.2345678901234e-200
  151. (4 rows)
  152. SELECT f.* FROM FLOAT8_TBL f WHERE f.f1 = '1004.3';
  153. f1
  154. --------
  155. 1004.3
  156. (1 row)
  157. SELECT f.* FROM FLOAT8_TBL f WHERE '1004.3' > f.f1;
  158. f1
  159. ----------------------
  160. 0
  161. -34.84
  162. 1.2345678901234e-200
  163. (3 rows)
  164. SELECT f.* FROM FLOAT8_TBL f WHERE f.f1 < '1004.3';
  165. f1
  166. ----------------------
  167. 0
  168. -34.84
  169. 1.2345678901234e-200
  170. (3 rows)
  171. SELECT f.* FROM FLOAT8_TBL f WHERE '1004.3' >= f.f1;
  172. f1
  173. ----------------------
  174. 0
  175. 1004.3
  176. -34.84
  177. 1.2345678901234e-200
  178. (4 rows)
  179. SELECT f.* FROM FLOAT8_TBL f WHERE f.f1 <= '1004.3';
  180. f1
  181. ----------------------
  182. 0
  183. 1004.3
  184. -34.84
  185. 1.2345678901234e-200
  186. (4 rows)
  187. SELECT f.f1, f.f1 * '-10' AS x
  188. FROM FLOAT8_TBL f
  189. WHERE f.f1 > '0.0';
  190. f1 | x
  191. ----------------------+-----------------------
  192. 1004.3 | -10043
  193. 1.2345678901234e+200 | -1.2345678901234e+201
  194. 1.2345678901234e-200 | -1.2345678901234e-199
  195. (3 rows)
  196. SELECT f.f1, f.f1 + '-10' AS x
  197. FROM FLOAT8_TBL f
  198. WHERE f.f1 > '0.0';
  199. f1 | x
  200. ----------------------+----------------------
  201. 1004.3 | 994.3
  202. 1.2345678901234e+200 | 1.2345678901234e+200
  203. 1.2345678901234e-200 | -10
  204. (3 rows)
  205. SELECT f.f1, f.f1 - '-10' AS x
  206. FROM FLOAT8_TBL f
  207. WHERE f.f1 > '0.0';
  208. f1 | x
  209. ----------------------+----------------------
  210. 1004.3 | 1014.3
  211. 1.2345678901234e+200 | 1.2345678901234e+200
  212. 1.2345678901234e-200 | 10
  213. (3 rows)
  214. -- absolute value
  215. SELECT f.f1, @f.f1 AS abs_f1
  216. FROM FLOAT8_TBL f;
  217. f1 | abs_f1
  218. ----------------------+----------------------
  219. 0 | 0
  220. 1004.3 | 1004.3
  221. -34.84 | 34.84
  222. 1.2345678901234e+200 | 1.2345678901234e+200
  223. 1.2345678901234e-200 | 1.2345678901234e-200
  224. (5 rows)
  225. -- truncate
  226. SELECT f.f1, trunc(f.f1) AS trunc_f1
  227. FROM FLOAT8_TBL f;
  228. f1 | trunc_f1
  229. ----------------------+----------------------
  230. 0 | 0
  231. 1004.3 | 1004
  232. -34.84 | -34
  233. 1.2345678901234e+200 | 1.2345678901234e+200
  234. 1.2345678901234e-200 | 0
  235. (5 rows)
  236. -- round
  237. SELECT f.f1, round(f.f1) AS round_f1
  238. FROM FLOAT8_TBL f;
  239. f1 | round_f1
  240. ----------------------+----------------------
  241. 0 | 0
  242. 1004.3 | 1004
  243. -34.84 | -35
  244. 1.2345678901234e+200 | 1.2345678901234e+200
  245. 1.2345678901234e-200 | 0
  246. (5 rows)
  247. -- avoid bit-exact output here because operations may not be bit-exact.
  248. SET extra_float_digits = 0;
  249. -- square root
  250. SELECT sqrt(float8 '64') AS eight;
  251. eight
  252. -------
  253. 8
  254. (1 row)
  255. SELECT |/ float8 '64' AS eight;
  256. eight
  257. -------
  258. 8
  259. (1 row)
  260. SELECT f.f1, |/f.f1 AS sqrt_f1
  261. FROM FLOAT8_TBL f
  262. WHERE f.f1 > '0.0';
  263. f1 | sqrt_f1
  264. ----------------------+-----------------------
  265. 1004.3 | 31.6906926399535
  266. 1.2345678901234e+200 | 1.11111110611109e+100
  267. 1.2345678901234e-200 | 1.11111110611109e-100
  268. (3 rows)
  269. -- power
  270. SELECT power(float8 '144', float8 '0.5');
  271. power
  272. -------
  273. 12
  274. (1 row)
  275. SELECT power(float8 'NaN', float8 '0.5');
  276. power
  277. -------
  278. NaN
  279. (1 row)
  280. SELECT power(float8 '144', float8 'NaN');
  281. power
  282. -------
  283. NaN
  284. (1 row)
  285. SELECT power(float8 'NaN', float8 'NaN');
  286. power
  287. -------
  288. NaN
  289. (1 row)
  290. SELECT power(float8 '-1', float8 'NaN');
  291. power
  292. -------
  293. NaN
  294. (1 row)
  295. SELECT power(float8 '1', float8 'NaN');
  296. power
  297. -------
  298. 1
  299. (1 row)
  300. SELECT power(float8 'NaN', float8 '0');
  301. power
  302. -------
  303. 1
  304. (1 row)
  305. SELECT power(float8 'inf', float8 '0');
  306. power
  307. -------
  308. 1
  309. (1 row)
  310. SELECT power(float8 '-inf', float8 '0');
  311. power
  312. -------
  313. 1
  314. (1 row)
  315. SELECT power(float8 '0', float8 'inf');
  316. power
  317. -------
  318. 0
  319. (1 row)
  320. SELECT power(float8 '0', float8 '-inf');
  321. ERROR: zero raised to a negative power is undefined
  322. SELECT power(float8 '1', float8 'inf');
  323. power
  324. -------
  325. 1
  326. (1 row)
  327. SELECT power(float8 '1', float8 '-inf');
  328. power
  329. -------
  330. 1
  331. (1 row)
  332. SELECT power(float8 '-1', float8 'inf');
  333. power
  334. -------
  335. 1
  336. (1 row)
  337. SELECT power(float8 '-1', float8 '-inf');
  338. power
  339. -------
  340. 1
  341. (1 row)
  342. SELECT power(float8 '0.1', float8 'inf');
  343. power
  344. -------
  345. 0
  346. (1 row)
  347. SELECT power(float8 '-0.1', float8 'inf');
  348. power
  349. -------
  350. 0
  351. (1 row)
  352. SELECT power(float8 '1.1', float8 'inf');
  353. power
  354. ----------
  355. Infinity
  356. (1 row)
  357. SELECT power(float8 '-1.1', float8 'inf');
  358. power
  359. ----------
  360. Infinity
  361. (1 row)
  362. SELECT power(float8 '0.1', float8 '-inf');
  363. power
  364. ----------
  365. Infinity
  366. (1 row)
  367. SELECT power(float8 '-0.1', float8 '-inf');
  368. power
  369. ----------
  370. Infinity
  371. (1 row)
  372. SELECT power(float8 '1.1', float8 '-inf');
  373. power
  374. -------
  375. 0
  376. (1 row)
  377. SELECT power(float8 '-1.1', float8 '-inf');
  378. power
  379. -------
  380. 0
  381. (1 row)
  382. SELECT power(float8 'inf', float8 '-2');
  383. power
  384. -------
  385. 0
  386. (1 row)
  387. SELECT power(float8 'inf', float8 '2');
  388. power
  389. ----------
  390. Infinity
  391. (1 row)
  392. SELECT power(float8 'inf', float8 'inf');
  393. power
  394. ----------
  395. Infinity
  396. (1 row)
  397. SELECT power(float8 'inf', float8 '-inf');
  398. power
  399. -------
  400. 0
  401. (1 row)
  402. -- Intel's icc misoptimizes the code that controls the sign of this result,
  403. -- even with -mp1. Pending a fix for that, only test for "is it zero".
  404. SELECT power(float8 '-inf', float8 '-2') = '0';
  405. ?column?
  406. ----------
  407. t
  408. (1 row)
  409. SELECT power(float8 '-inf', float8 '-3');
  410. power
  411. -------
  412. -0
  413. (1 row)
  414. SELECT power(float8 '-inf', float8 '2');
  415. power
  416. ----------
  417. Infinity
  418. (1 row)
  419. SELECT power(float8 '-inf', float8 '3');
  420. power
  421. -----------
  422. -Infinity
  423. (1 row)
  424. SELECT power(float8 '-inf', float8 '3.5');
  425. ERROR: a negative number raised to a non-integer power yields a complex result
  426. SELECT power(float8 '-inf', float8 'inf');
  427. power
  428. ----------
  429. Infinity
  430. (1 row)
  431. SELECT power(float8 '-inf', float8 '-inf');
  432. power
  433. -------
  434. 0
  435. (1 row)
  436. -- take exp of ln(f.f1)
  437. SELECT f.f1, exp(ln(f.f1)) AS exp_ln_f1
  438. FROM FLOAT8_TBL f
  439. WHERE f.f1 > '0.0';
  440. f1 | exp_ln_f1
  441. ----------------------+-----------------------
  442. 1004.3 | 1004.3
  443. 1.2345678901234e+200 | 1.23456789012338e+200
  444. 1.2345678901234e-200 | 1.23456789012339e-200
  445. (3 rows)
  446. -- cube root
  447. SELECT ||/ float8 '27' AS three;
  448. three
  449. -------
  450. 3
  451. (1 row)
  452. SELECT f.f1, ||/f.f1 AS cbrt_f1 FROM FLOAT8_TBL f;
  453. f1 | cbrt_f1
  454. ----------------------+----------------------
  455. 0 | 0
  456. 1004.3 | 10.014312837827
  457. -34.84 | -3.26607421344208
  458. 1.2345678901234e+200 | 4.97933859234765e+66
  459. 1.2345678901234e-200 | 2.3112042409018e-67
  460. (5 rows)
  461. SELECT * FROM FLOAT8_TBL;
  462. f1
  463. ----------------------
  464. 0
  465. 1004.3
  466. -34.84
  467. 1.2345678901234e+200
  468. 1.2345678901234e-200
  469. (5 rows)
  470. SELECT f.f1 * '1e200' from FLOAT8_TBL f;
  471. ERROR: value out of range: overflow
  472. SELECT f.f1 ^ '1e200' from FLOAT8_TBL f;
  473. ERROR: value out of range: overflow
  474. SELECT 0 ^ 0 + 0 ^ 1 + 0 ^ 0.0 + 0 ^ 0.5;
  475. ?column?
  476. ----------
  477. 2
  478. (1 row)
  479. SELECT ln(f.f1) from FLOAT8_TBL f where f.f1 = '0.0' ;
  480. ERROR: cannot take logarithm of zero
  481. SELECT ln(f.f1) from FLOAT8_TBL f where f.f1 < '0.0' ;
  482. ERROR: cannot take logarithm of a negative number
  483. SELECT f.f1 / '0.0' from FLOAT8_TBL f;
  484. ERROR: division by zero
  485. -- hyperbolic functions
  486. -- we run these with extra_float_digits = 0 too, since different platforms
  487. -- tend to produce results that vary in the last place.
  488. SELECT sinh(float8 '1');
  489. sinh
  490. -----------------
  491. 1.1752011936438
  492. (1 row)
  493. SELECT cosh(float8 '1');
  494. cosh
  495. ------------------
  496. 1.54308063481524
  497. (1 row)
  498. SELECT tanh(float8 '1');
  499. tanh
  500. -------------------
  501. 0.761594155955765
  502. (1 row)
  503. SELECT asinh(float8 '1');
  504. asinh
  505. -------------------
  506. 0.881373587019543
  507. (1 row)
  508. SELECT acosh(float8 '2');
  509. acosh
  510. ------------------
  511. 1.31695789692482
  512. (1 row)
  513. SELECT atanh(float8 '0.5');
  514. atanh
  515. -------------------
  516. 0.549306144334055
  517. (1 row)
  518. -- test Inf/NaN cases for hyperbolic functions
  519. SELECT sinh(float8 'infinity');
  520. sinh
  521. ----------
  522. Infinity
  523. (1 row)
  524. SELECT sinh(float8 '-infinity');
  525. sinh
  526. -----------
  527. -Infinity
  528. (1 row)
  529. SELECT sinh(float8 'nan');
  530. sinh
  531. ------
  532. NaN
  533. (1 row)
  534. SELECT cosh(float8 'infinity');
  535. cosh
  536. ----------
  537. Infinity
  538. (1 row)
  539. SELECT cosh(float8 '-infinity');
  540. cosh
  541. ----------
  542. Infinity
  543. (1 row)
  544. SELECT cosh(float8 'nan');
  545. cosh
  546. ------
  547. NaN
  548. (1 row)
  549. SELECT tanh(float8 'infinity');
  550. tanh
  551. ------
  552. 1
  553. (1 row)
  554. SELECT tanh(float8 '-infinity');
  555. tanh
  556. ------
  557. -1
  558. (1 row)
  559. SELECT tanh(float8 'nan');
  560. tanh
  561. ------
  562. NaN
  563. (1 row)
  564. SELECT asinh(float8 'infinity');
  565. asinh
  566. ----------
  567. Infinity
  568. (1 row)
  569. SELECT asinh(float8 '-infinity');
  570. asinh
  571. -----------
  572. -Infinity
  573. (1 row)
  574. SELECT asinh(float8 'nan');
  575. asinh
  576. -------
  577. NaN
  578. (1 row)
  579. -- acosh(Inf) should be Inf, but some mingw versions produce NaN, so skip test
  580. -- SELECT acosh(float8 'infinity');
  581. SELECT acosh(float8 '-infinity');
  582. ERROR: input is out of range
  583. SELECT acosh(float8 'nan');
  584. acosh
  585. -------
  586. NaN
  587. (1 row)
  588. SELECT atanh(float8 'infinity');
  589. ERROR: input is out of range
  590. SELECT atanh(float8 '-infinity');
  591. ERROR: input is out of range
  592. SELECT atanh(float8 'nan');
  593. atanh
  594. -------
  595. NaN
  596. (1 row)
  597. RESET extra_float_digits;
  598. -- test for over- and underflow
  599. INSERT INTO FLOAT8_TBL(f1) VALUES ('10e400');
  600. ERROR: "10e400" is out of range for type double precision
  601. LINE 1: INSERT INTO FLOAT8_TBL(f1) VALUES ('10e400');
  602. ^
  603. INSERT INTO FLOAT8_TBL(f1) VALUES ('-10e400');
  604. ERROR: "-10e400" is out of range for type double precision
  605. LINE 1: INSERT INTO FLOAT8_TBL(f1) VALUES ('-10e400');
  606. ^
  607. INSERT INTO FLOAT8_TBL(f1) VALUES ('10e-400');
  608. ERROR: "10e-400" is out of range for type double precision
  609. LINE 1: INSERT INTO FLOAT8_TBL(f1) VALUES ('10e-400');
  610. ^
  611. INSERT INTO FLOAT8_TBL(f1) VALUES ('-10e-400');
  612. ERROR: "-10e-400" is out of range for type double precision
  613. LINE 1: INSERT INTO FLOAT8_TBL(f1) VALUES ('-10e-400');
  614. ^
  615. INSERT INTO FLOAT8_TBL(f1) VALUES ('0.0');
  616. INSERT INTO FLOAT8_TBL(f1) VALUES ('-34.84');
  617. INSERT INTO FLOAT8_TBL(f1) VALUES ('-1004.30');
  618. INSERT INTO FLOAT8_TBL(f1) VALUES ('-1.2345678901234e+200');
  619. INSERT INTO FLOAT8_TBL(f1) VALUES ('-1.2345678901234e-200');
  620. -- test edge-case coercions to integer
  621. SELECT '32767.4'::float8::int2;
  622. int2
  623. -------
  624. 32767
  625. (1 row)
  626. SELECT '32767.6'::float8::int2;
  627. ERROR: smallint out of range
  628. SELECT '-32768.4'::float8::int2;
  629. int2
  630. --------
  631. -32768
  632. (1 row)
  633. SELECT '-32768.6'::float8::int2;
  634. ERROR: smallint out of range
  635. SELECT '2147483647.4'::float8::int4;
  636. int4
  637. ------------
  638. 2147483647
  639. (1 row)
  640. SELECT '2147483647.6'::float8::int4;
  641. ERROR: integer out of range
  642. SELECT '-2147483648.4'::float8::int4;
  643. int4
  644. -------------
  645. -2147483648
  646. (1 row)
  647. SELECT '-2147483648.6'::float8::int4;
  648. ERROR: integer out of range
  649. SELECT '9223372036854773760'::float8::int8;
  650. int8
  651. ---------------------
  652. 9223372036854773760
  653. (1 row)
  654. SELECT '9223372036854775807'::float8::int8;
  655. ERROR: bigint out of range
  656. SELECT '-9223372036854775808.5'::float8::int8;
  657. int8
  658. ----------------------
  659. -9223372036854775808
  660. (1 row)
  661. SELECT '-9223372036854780000'::float8::int8;
  662. ERROR: bigint out of range
  663. -- test exact cases for trigonometric functions in degrees
  664. SELECT x,
  665. sind(x),
  666. sind(x) IN (-1,-0.5,0,0.5,1) AS sind_exact
  667. FROM (VALUES (0), (30), (90), (150), (180),
  668. (210), (270), (330), (360)) AS t(x);
  669. x | sind | sind_exact
  670. -----+------+------------
  671. 0 | 0 | t
  672. 30 | 0.5 | t
  673. 90 | 1 | t
  674. 150 | 0.5 | t
  675. 180 | 0 | t
  676. 210 | -0.5 | t
  677. 270 | -1 | t
  678. 330 | -0.5 | t
  679. 360 | 0 | t
  680. (9 rows)
  681. SELECT x,
  682. cosd(x),
  683. cosd(x) IN (-1,-0.5,0,0.5,1) AS cosd_exact
  684. FROM (VALUES (0), (60), (90), (120), (180),
  685. (240), (270), (300), (360)) AS t(x);
  686. x | cosd | cosd_exact
  687. -----+------+------------
  688. 0 | 1 | t
  689. 60 | 0.5 | t
  690. 90 | 0 | t
  691. 120 | -0.5 | t
  692. 180 | -1 | t
  693. 240 | -0.5 | t
  694. 270 | 0 | t
  695. 300 | 0.5 | t
  696. 360 | 1 | t
  697. (9 rows)
  698. SELECT x,
  699. tand(x),
  700. tand(x) IN ('-Infinity'::float8,-1,0,
  701. 1,'Infinity'::float8) AS tand_exact,
  702. cotd(x),
  703. cotd(x) IN ('-Infinity'::float8,-1,0,
  704. 1,'Infinity'::float8) AS cotd_exact
  705. FROM (VALUES (0), (45), (90), (135), (180),
  706. (225), (270), (315), (360)) AS t(x);
  707. x | tand | tand_exact | cotd | cotd_exact
  708. -----+-----------+------------+-----------+------------
  709. 0 | 0 | t | Infinity | t
  710. 45 | 1 | t | 1 | t
  711. 90 | Infinity | t | 0 | t
  712. 135 | -1 | t | -1 | t
  713. 180 | 0 | t | -Infinity | t
  714. 225 | 1 | t | 1 | t
  715. 270 | -Infinity | t | 0 | t
  716. 315 | -1 | t | -1 | t
  717. 360 | 0 | t | Infinity | t
  718. (9 rows)
  719. SELECT x,
  720. atand(x),
  721. atand(x) IN (-90,-45,0,45,90) AS atand_exact
  722. FROM (VALUES ('-Infinity'::float8), (-1), (0), (1),
  723. ('Infinity'::float8)) AS t(x);
  724. x | atand | atand_exact
  725. -----------+-------+-------------
  726. -Infinity | -90 | t
  727. -1 | -45 | t
  728. 0 | 0 | t
  729. 1 | 45 | t
  730. Infinity | 90 | t
  731. (5 rows)
  732. SELECT x, y,
  733. atan2d(y, x),
  734. atan2d(y, x) IN (-90,0,90,180) AS atan2d_exact
  735. FROM (SELECT 10*cosd(a), 10*sind(a)
  736. FROM generate_series(0, 360, 90) AS t(a)) AS t(x,y);
  737. x | y | atan2d | atan2d_exact
  738. -----+-----+--------+--------------
  739. 10 | 0 | 0 | t
  740. 0 | 10 | 90 | t
  741. -10 | 0 | 180 | t
  742. 0 | -10 | -90 | t
  743. 10 | 0 | 0 | t
  744. (5 rows)