Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commitede8f4e

Browse files
committed
Add variant regression file to support BSDen that underflow to plus zero instead
of minus zero. Per Andrew Dunstan.
1 parente5f7a9f commitede8f4e

File tree

1 file changed

+396
-0
lines changed

1 file changed

+396
-0
lines changed
Lines changed: 396 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,396 @@
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+
SELECT '-10e400'::float8;
14+
ERROR: "-10e400" is out of range for type double precision
15+
SELECT '10e-400'::float8;
16+
float8
17+
--------
18+
0
19+
(1 row)
20+
21+
SELECT '-10e-400'::float8;
22+
float8
23+
--------
24+
0
25+
(1 row)
26+
27+
-- bad input
28+
INSERT INTO FLOAT8_TBL(f1) VALUES (' ');
29+
ERROR: invalid input syntax for type double precision: " "
30+
INSERT INTO FLOAT8_TBL(f1) VALUES ('xyz');
31+
ERROR: invalid input syntax for type double precision: "xyz"
32+
INSERT INTO FLOAT8_TBL(f1) VALUES ('5.0.0');
33+
ERROR: invalid input syntax for type double precision: "5.0.0"
34+
INSERT INTO FLOAT8_TBL(f1) VALUES ('5 . 0');
35+
ERROR: invalid input syntax for type double precision: "5 . 0"
36+
INSERT INTO FLOAT8_TBL(f1) VALUES ('5. 0');
37+
ERROR: invalid input syntax for type double precision: "5. 0"
38+
INSERT INTO FLOAT8_TBL(f1) VALUES (' - 3');
39+
ERROR: invalid input syntax for type double precision: " - 3"
40+
INSERT INTO FLOAT8_TBL(f1) VALUES ('123 5');
41+
ERROR: invalid input syntax for type double precision: "123 5"
42+
-- special inputs
43+
SELECT 'NaN'::float8;
44+
float8
45+
--------
46+
NaN
47+
(1 row)
48+
49+
SELECT 'nan'::float8;
50+
float8
51+
--------
52+
NaN
53+
(1 row)
54+
55+
SELECT ' NAN '::float8;
56+
float8
57+
--------
58+
NaN
59+
(1 row)
60+
61+
SELECT 'infinity'::float8;
62+
float8
63+
----------
64+
Infinity
65+
(1 row)
66+
67+
SELECT ' -INFINiTY '::float8;
68+
float8
69+
-----------
70+
-Infinity
71+
(1 row)
72+
73+
-- bad special inputs
74+
SELECT 'N A N'::float8;
75+
ERROR: invalid input syntax for type double precision: "N A N"
76+
SELECT 'NaN x'::float8;
77+
ERROR: invalid input syntax for type double precision: "NaN x"
78+
SELECT ' INFINITY x'::float8;
79+
ERROR: invalid input syntax for type double precision: " INFINITY x"
80+
SELECT 'Infinity'::float8 + 100.0;
81+
ERROR: type "double precision" value out of range: overflow
82+
SELECT 'Infinity'::float8 / 'Infinity'::float8;
83+
?column?
84+
----------
85+
NaN
86+
(1 row)
87+
88+
SELECT 'nan'::float8 / 'nan'::float8;
89+
?column?
90+
----------
91+
NaN
92+
(1 row)
93+
94+
SELECT '' AS five, FLOAT8_TBL.*;
95+
five | f1
96+
------+----------------------
97+
| 0
98+
| 1004.3
99+
| -34.84
100+
| 1.2345678901234e+200
101+
| 1.2345678901234e-200
102+
(5 rows)
103+
104+
SELECT '' AS four, f.* FROM FLOAT8_TBL f WHERE f.f1 <> '1004.3';
105+
four | f1
106+
------+----------------------
107+
| 0
108+
| -34.84
109+
| 1.2345678901234e+200
110+
| 1.2345678901234e-200
111+
(4 rows)
112+
113+
SELECT '' AS one, f.* FROM FLOAT8_TBL f WHERE f.f1 = '1004.3';
114+
one | f1
115+
-----+--------
116+
| 1004.3
117+
(1 row)
118+
119+
SELECT '' AS three, f.* FROM FLOAT8_TBL f WHERE '1004.3' > f.f1;
120+
three | f1
121+
-------+----------------------
122+
| 0
123+
| -34.84
124+
| 1.2345678901234e-200
125+
(3 rows)
126+
127+
SELECT '' AS three, f.* FROM FLOAT8_TBL f WHERE f.f1 < '1004.3';
128+
three | f1
129+
-------+----------------------
130+
| 0
131+
| -34.84
132+
| 1.2345678901234e-200
133+
(3 rows)
134+
135+
SELECT '' AS four, f.* FROM FLOAT8_TBL f WHERE '1004.3' >= f.f1;
136+
four | f1
137+
------+----------------------
138+
| 0
139+
| 1004.3
140+
| -34.84
141+
| 1.2345678901234e-200
142+
(4 rows)
143+
144+
SELECT '' AS four, f.* FROM FLOAT8_TBL f WHERE f.f1 <= '1004.3';
145+
four | f1
146+
------+----------------------
147+
| 0
148+
| 1004.3
149+
| -34.84
150+
| 1.2345678901234e-200
151+
(4 rows)
152+
153+
SELECT '' AS three, f.f1, f.f1 * '-10' AS x
154+
FROM FLOAT8_TBL f
155+
WHERE f.f1 > '0.0';
156+
three | f1 | x
157+
-------+----------------------+-----------------------
158+
| 1004.3 | -10043
159+
| 1.2345678901234e+200 | -1.2345678901234e+201
160+
| 1.2345678901234e-200 | -1.2345678901234e-199
161+
(3 rows)
162+
163+
SELECT '' AS three, f.f1, f.f1 + '-10' AS x
164+
FROM FLOAT8_TBL f
165+
WHERE f.f1 > '0.0';
166+
three | f1 | x
167+
-------+----------------------+----------------------
168+
| 1004.3 | 994.3
169+
| 1.2345678901234e+200 | 1.2345678901234e+200
170+
| 1.2345678901234e-200 | -10
171+
(3 rows)
172+
173+
SELECT '' AS three, f.f1, f.f1 / '-10' AS x
174+
FROM FLOAT8_TBL f
175+
WHERE f.f1 > '0.0';
176+
three | f1 | x
177+
-------+----------------------+-----------------------
178+
| 1004.3 | -100.43
179+
| 1.2345678901234e+200 | -1.2345678901234e+199
180+
| 1.2345678901234e-200 | -1.2345678901234e-201
181+
(3 rows)
182+
183+
SELECT '' AS three, f.f1, f.f1 - '-10' AS x
184+
FROM FLOAT8_TBL f
185+
WHERE f.f1 > '0.0';
186+
three | f1 | x
187+
-------+----------------------+----------------------
188+
| 1004.3 | 1014.3
189+
| 1.2345678901234e+200 | 1.2345678901234e+200
190+
| 1.2345678901234e-200 | 10
191+
(3 rows)
192+
193+
SELECT '' AS one, f.f1 ^ '2.0' AS square_f1
194+
FROM FLOAT8_TBL f where f.f1 = '1004.3';
195+
one | square_f1
196+
-----+------------
197+
| 1008618.49
198+
(1 row)
199+
200+
-- absolute value
201+
SELECT '' AS five, f.f1, @f.f1 AS abs_f1
202+
FROM FLOAT8_TBL f;
203+
five | f1 | abs_f1
204+
------+----------------------+----------------------
205+
| 0 | 0
206+
| 1004.3 | 1004.3
207+
| -34.84 | 34.84
208+
| 1.2345678901234e+200 | 1.2345678901234e+200
209+
| 1.2345678901234e-200 | 1.2345678901234e-200
210+
(5 rows)
211+
212+
-- truncate
213+
SELECT '' AS five, f.f1, %f.f1 AS trunc_f1
214+
FROM FLOAT8_TBL f;
215+
five | f1 | trunc_f1
216+
------+----------------------+----------------------
217+
| 0 | 0
218+
| 1004.3 | 1004
219+
| -34.84 | -34
220+
| 1.2345678901234e+200 | 1.2345678901234e+200
221+
| 1.2345678901234e-200 | 0
222+
(5 rows)
223+
224+
-- round
225+
SELECT '' AS five, f.f1, f.f1 % AS round_f1
226+
FROM FLOAT8_TBL f;
227+
five | f1 | round_f1
228+
------+----------------------+----------------------
229+
| 0 | 0
230+
| 1004.3 | 1004
231+
| -34.84 | -35
232+
| 1.2345678901234e+200 | 1.2345678901234e+200
233+
| 1.2345678901234e-200 | 0
234+
(5 rows)
235+
236+
-- ceil / ceiling
237+
select ceil(f1) as ceil_f1 from float8_tbl f;
238+
ceil_f1
239+
----------------------
240+
0
241+
1005
242+
-34
243+
1.2345678901234e+200
244+
1
245+
(5 rows)
246+
247+
select ceiling(f1) as ceiling_f1 from float8_tbl f;
248+
ceiling_f1
249+
----------------------
250+
0
251+
1005
252+
-34
253+
1.2345678901234e+200
254+
1
255+
(5 rows)
256+
257+
-- floor
258+
select floor(f1) as floor_f1 from float8_tbl f;
259+
floor_f1
260+
----------------------
261+
0
262+
1004
263+
-35
264+
1.2345678901234e+200
265+
0
266+
(5 rows)
267+
268+
-- sign
269+
select sign(f1) as sign_f1 from float8_tbl f;
270+
sign_f1
271+
---------
272+
0
273+
1
274+
-1
275+
1
276+
1
277+
(5 rows)
278+
279+
-- square root
280+
SELECT sqrt(float8 '64') AS eight;
281+
eight
282+
-------
283+
8
284+
(1 row)
285+
286+
SELECT |/ float8 '64' AS eight;
287+
eight
288+
-------
289+
8
290+
(1 row)
291+
292+
SELECT '' AS three, f.f1, |/f.f1 AS sqrt_f1
293+
FROM FLOAT8_TBL f
294+
WHERE f.f1 > '0.0';
295+
three | f1 | sqrt_f1
296+
-------+----------------------+-----------------------
297+
| 1004.3 | 31.6906926399535
298+
| 1.2345678901234e+200 | 1.11111110611109e+100
299+
| 1.2345678901234e-200 | 1.11111110611109e-100
300+
(3 rows)
301+
302+
-- power
303+
SELECT power(float8 '144', float8 '0.5');
304+
power
305+
-------
306+
12
307+
(1 row)
308+
309+
-- take exp of ln(f.f1)
310+
SELECT '' AS three, f.f1, exp(ln(f.f1)) AS exp_ln_f1
311+
FROM FLOAT8_TBL f
312+
WHERE f.f1 > '0.0';
313+
three | f1 | exp_ln_f1
314+
-------+----------------------+-----------------------
315+
| 1004.3 | 1004.3
316+
| 1.2345678901234e+200 | 1.23456789012338e+200
317+
| 1.2345678901234e-200 | 1.23456789012339e-200
318+
(3 rows)
319+
320+
-- cube root
321+
SELECT ||/ float8 '27' AS three;
322+
three
323+
-------
324+
3
325+
(1 row)
326+
327+
SELECT '' AS five, f.f1, ||/f.f1 AS cbrt_f1 FROM FLOAT8_TBL f;
328+
five | f1 | cbrt_f1
329+
------+----------------------+----------------------
330+
| 0 | 0
331+
| 1004.3 | 10.014312837827
332+
| -34.84 | -3.26607421344208
333+
| 1.2345678901234e+200 | 4.97933859234765e+66
334+
| 1.2345678901234e-200 | 2.3112042409018e-67
335+
(5 rows)
336+
337+
SELECT '' AS five, FLOAT8_TBL.*;
338+
five | f1
339+
------+----------------------
340+
| 0
341+
| 1004.3
342+
| -34.84
343+
| 1.2345678901234e+200
344+
| 1.2345678901234e-200
345+
(5 rows)
346+
347+
UPDATE FLOAT8_TBL
348+
SET f1 = FLOAT8_TBL.f1 * '-1'
349+
WHERE FLOAT8_TBL.f1 > '0.0';
350+
SELECT '' AS bad, f.f1 * '1e200' from FLOAT8_TBL f;
351+
ERROR: type "double precision" value out of range: overflow
352+
SELECT '' AS bad, f.f1 ^ '1e200' from FLOAT8_TBL f;
353+
ERROR: result is out of range
354+
SELECT '' AS bad, ln(f.f1) from FLOAT8_TBL f where f.f1 = '0.0' ;
355+
ERROR: cannot take logarithm of zero
356+
SELECT '' AS bad, ln(f.f1) from FLOAT8_TBL f where f.f1 < '0.0' ;
357+
ERROR: cannot take logarithm of a negative number
358+
SELECT '' AS bad, exp(f.f1) from FLOAT8_TBL f;
359+
ERROR: result is out of range
360+
SELECT '' AS bad, f.f1 / '0.0' from FLOAT8_TBL f;
361+
ERROR: division by zero
362+
SELECT '' AS five, FLOAT8_TBL.*;
363+
five | f1
364+
------+-----------------------
365+
| 0
366+
| -34.84
367+
| -1004.3
368+
| -1.2345678901234e+200
369+
| -1.2345678901234e-200
370+
(5 rows)
371+
372+
-- test for over- and underflow
373+
INSERT INTO FLOAT8_TBL(f1) VALUES ('10e400');
374+
ERROR: "10e400" is out of range for type double precision
375+
INSERT INTO FLOAT8_TBL(f1) VALUES ('-10e400');
376+
ERROR: "-10e400" is out of range for type double precision
377+
INSERT INTO FLOAT8_TBL(f1) VALUES ('10e-400');
378+
INSERT INTO FLOAT8_TBL(f1) VALUES ('-10e-400');
379+
-- maintain external table consistency across platforms
380+
-- delete all values and reinsert well-behaved ones
381+
DELETE FROM FLOAT8_TBL;
382+
INSERT INTO FLOAT8_TBL(f1) VALUES ('0.0');
383+
INSERT INTO FLOAT8_TBL(f1) VALUES ('-34.84');
384+
INSERT INTO FLOAT8_TBL(f1) VALUES ('-1004.30');
385+
INSERT INTO FLOAT8_TBL(f1) VALUES ('-1.2345678901234e+200');
386+
INSERT INTO FLOAT8_TBL(f1) VALUES ('-1.2345678901234e-200');
387+
SELECT '' AS five, FLOAT8_TBL.*;
388+
five | f1
389+
------+-----------------------
390+
| 0
391+
| -34.84
392+
| -1004.3
393+
| -1.2345678901234e+200
394+
| -1.2345678901234e-200
395+
(5 rows)
396+

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp