PostgreSQL Source Code: src/include/utils/float.h File Reference (original) (raw)
#include <math.h>


Go to the source code of this file.
| Functions | |
|---|---|
| pg_noreturn void | float_overflow_error (void) |
| pg_noreturn void | float_underflow_error (void) |
| pg_noreturn void | float_zero_divide_error (void) |
| int | is_infinite (float8 val) |
| float8 | float8in_internal (char *num, char **endptr_p, const char *type_name, const char *orig_string, struct Node *escontext) |
| float4 | float4in_internal (char *num, char **endptr_p, const char *type_name, const char *orig_string, struct Node *escontext) |
| char * | float8out_internal (float8 num) |
| int | float4_cmp_internal (float4 a, float4 b) |
| int | float8_cmp_internal (float8 a, float8 b) |
| static float4 | get_float4_infinity (void) |
| static float8 | get_float8_infinity (void) |
| static float4 | get_float4_nan (void) |
| static float8 | get_float8_nan (void) |
| static float4 | float4_pl (const float4 val1, const float4 val2) |
| static float8 | float8_pl (const float8 val1, const float8 val2) |
| static float4 | float4_mi (const float4 val1, const float4 val2) |
| static float8 | float8_mi (const float8 val1, const float8 val2) |
| static float4 | float4_mul (const float4 val1, const float4 val2) |
| static float8 | float8_mul (const float8 val1, const float8 val2) |
| static float4 | float4_div (const float4 val1, const float4 val2) |
| static float8 | float8_div (const float8 val1, const float8 val2) |
| static bool | float4_eq (const float4 val1, const float4 val2) |
| static bool | float8_eq (const float8 val1, const float8 val2) |
| static bool | float4_ne (const float4 val1, const float4 val2) |
| static bool | float8_ne (const float8 val1, const float8 val2) |
| static bool | float4_lt (const float4 val1, const float4 val2) |
| static bool | float8_lt (const float8 val1, const float8 val2) |
| static bool | float4_le (const float4 val1, const float4 val2) |
| static bool | float8_le (const float8 val1, const float8 val2) |
| static bool | float4_gt (const float4 val1, const float4 val2) |
| static bool | float8_gt (const float8 val1, const float8 val2) |
| static bool | float4_ge (const float4 val1, const float4 val2) |
| static bool | float8_ge (const float8 val1, const float8 val2) |
| static float4 | float4_min (const float4 val1, const float4 val2) |
| static float8 | float8_min (const float8 val1, const float8 val2) |
| static float4 | float4_max (const float4 val1, const float4 val2) |
| static float8 | float8_max (const float8 val1, const float8 val2) |
◆ M_PI
#define M_PI 3.14159265358979323846
Definition at line 22 of file float.h.
◆ RADIANS_PER_DEGREE
#define RADIANS_PER_DEGREE 0.0174532925199432957692
Definition at line 26 of file float.h.
◆ float4_cmp_internal()
◆ float4_div()
◆ float4_eq()
| static bool float4_eq ( const float4 val1, const float4 val2 ) | inlinestatic |
|---|
Definition at line 217 of file float.h.
218{
219 return isnan(val1) ? isnan(val2) : !isnan(val2) && val1 == val2;
220}
Referenced by float4eq().
◆ float4_ge()
| static bool float4_ge ( const float4 val1, const float4 val2 ) | inlinestatic |
|---|
Definition at line 277 of file float.h.
278{
279 return isnan(val1) || (!isnan(val2) && val1 >= val2);
280}
Referenced by float4ge().
◆ float4_gt()
| static bool float4_gt ( const float4 val1, const float4 val2 ) | inlinestatic |
|---|
◆ float4_le()
| static bool float4_le ( const float4 val1, const float4 val2 ) | inlinestatic |
|---|
Definition at line 253 of file float.h.
254{
255 return isnan(val2) || (!isnan(val1) && val1 <= val2);
256}
Referenced by float4le().
◆ float4_lt()
| static bool float4_lt ( const float4 val1, const float4 val2 ) | inlinestatic |
|---|
◆ float4_max()
◆ float4_mi()
◆ float4_min()
◆ float4_mul()
◆ float4_ne()
| static bool float4_ne ( const float4 val1, const float4 val2 ) | inlinestatic |
|---|
Definition at line 229 of file float.h.
230{
231 return isnan(val1) ? !isnan(val2) : isnan(val2) || val1 != val2;
232}
Referenced by float4ne().
◆ float4_pl()
◆ float4in_internal()
| float4 float4in_internal | ( | char * | num, |
|---|---|---|---|
| char ** | endptr_p, | ||
| const char * | type_name, | ||
| const char * | orig_string, | ||
| struct Node * | escontext | ||
| ) |
Definition at line 183 of file float.c.
186{
187 float val;
188 char *endptr;
189
190
191
192
193
194
195
196
197 while (*num != '\0' && isspace((unsigned char) *num))
198 num++;
199
200
201
202
203
204 if (*num == '\0')
206 (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
207 errmsg("invalid input syntax for type %s: \"%s\"",
208 type_name, orig_string)));
209
210 errno = 0;
211 val = strtof(num, &endptr);
212
213
214 if (endptr == num || errno != 0)
215 {
216 int save_errno = errno;
217
218
219
220
221
222
223
224
225
226
227
229 {
231 endptr = num + 3;
232 }
234 {
236 endptr = num + 8;
237 }
239 {
241 endptr = num + 9;
242 }
244 {
246 endptr = num + 9;
247 }
249 {
251 endptr = num + 3;
252 }
254 {
256 endptr = num + 4;
257 }
259 {
261 endptr = num + 4;
262 }
263 else if (save_errno == ERANGE)
264 {
265
266
267
268
269
270
271
272 if (val == 0.0 ||
273#if !defined(HUGE_VALF)
274 isinf(val)
275#else
276 (val >= HUGE_VALF || val <= -HUGE_VALF)
277#endif
278 )
279 {
280
281 char *errnumber = pstrdup(num);
282
283 errnumber[endptr - num] = '\0';
284
286 (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
287 errmsg("\"%s\" is out of range for type real",
288 errnumber)));
289 }
290 }
291 else
293 (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
294 errmsg("invalid input syntax for type %s: \"%s\"",
295 type_name, orig_string)));
296 }
297
298
299 while (*endptr != '\0' && isspace((unsigned char) *endptr))
300 endptr++;
301
302
303 if (endptr_p)
304 *endptr_p = endptr;
305 else if (*endptr != '\0')
307 (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
308 errmsg("invalid input syntax for type %s: \"%s\"",
309 type_name, orig_string)));
310
311 return val;
312}
int errcode(int sqlerrcode)
int errmsg(const char *fmt,...)
#define ereturn(context, dummy_value,...)
static float4 get_float4_infinity(void)
static float4 get_float4_nan(void)
char * pstrdup(const char *in)
int pg_strncasecmp(const char *s1, const char *s2, size_t n)
References ereturn, errcode(), errmsg(), get_float4_infinity(), get_float4_nan(), pg_strncasecmp(), pstrdup(), and val.
Referenced by float4in().
◆ float8_cmp_internal()
Definition at line 910 of file float.c.
911{
913 return 1;
915 return -1;
916 return 0;
917}
static bool float8_lt(const float8 val1, const float8 val2)
static bool float8_gt(const float8 val1, const float8 val2)
References a, b, float8_gt(), and float8_lt().
Referenced by btfloat48cmp(), btfloat84cmp(), btfloat8cmp(), btfloat8fastcmp(), common_entry_cmp(), gbt_float8_ssup_cmp(), interval_cmp_lower(), interval_cmp_upper(), and pairingheap_GISTSearchItem_cmp().
◆ float8_div()
Definition at line 193 of file float.h.
194{
196
197 if (unlikely(val2 == 0.0) && !isnan(val1))
199 result = val1 / val2;
200 if (unlikely(isinf(result)) && !isinf(val1))
202 if (unlikely(result == 0.0) && val1 != 0.0 && !isinf(val2))
204
205 return result;
206}
References float_overflow_error(), float_underflow_error(), float_zero_divide_error(), and unlikely.
Referenced by box_circle(), box_cn(), cash_div_float8(), circle_box(), circle_div_pt(), circle_poly(), degrees(), float48div(), float84div(), float8div(), g_box_consider_split(), line_distance(), line_eq(), line_interpt_line(), line_invsl(), line_perp(), line_sl(), lseg_center(), lseg_inside_poly(), path_area(), point_div_point(), point_invsl(), point_sl(), and poly_to_circle().
◆ float8_eq()
| static bool float8_eq ( const float8 val1, const float8 val2 ) | inlinestatic |
|---|
◆ float8_ge()
| static bool float8_ge ( const float8 val1, const float8 val2 ) | inlinestatic |
|---|
◆ float8_gt()
| static bool float8_gt ( const float8 val1, const float8 val2 ) | inlinestatic |
|---|
◆ float8_le()
| static bool float8_le ( const float8 val1, const float8 val2 ) | inlinestatic |
|---|
◆ float8_lt()
| static bool float8_lt ( const float8 val1, const float8 val2 ) | inlinestatic |
|---|
Definition at line 247 of file float.h.
248{
249 return !isnan(val1) && (isnan(val2) || val1 < val2);
250}
Referenced by adjustBox(), box_closept_lseg(), box_closept_point(), box_in(), box_recv(), dist_ppath_internal(), dist_ppoly_internal(), float48lt(), float84lt(), float8_cmp_internal(), float8_min(), float8lt(), float8smaller(), gist_box_picksplit(), lseg_closept_lseg(), make_bound_box(), path_distance(), and poly_distance().
◆ float8_max()
◆ float8_mi()
Definition at line 137 of file float.h.
138{
140
141 result = val1 - val2;
142 if (unlikely(isinf(result)) && !isinf(val1) && !isinf(val2))
144
145 return result;
146}
References float_overflow_error(), and unlikely.
Referenced by box_ht(), box_penalty(), box_wd(), circle_above(), circle_below(), circle_box(), circle_contain(), circle_contained(), circle_distance(), circle_left(), circle_overabove(), circle_overright(), circle_poly(), circle_right(), computeDistance(), dist_cpoint(), dist_cpoly_internal(), dist_pc(), float48mi(), float84mi(), float8mi(), g_box_consider_split(), gist_box_picksplit(), gist_circle_compress(), gist_circle_consistent(), line_construct(), line_distance(), line_interpt_line(), lseg_crossing(), path_area(), point_div_point(), point_dt(), point_inside(), point_invsl(), point_mul_point(), point_sl(), point_sub_point(), and size_box().
◆ float8_min()
◆ float8_mul()
Definition at line 163 of file float.h.
164{
166
167 result = val1 * val2;
168 if (unlikely(isinf(result)) && !isinf(val1) && !isinf(val2))
170 if (unlikely(result == 0.0) && val1 != 0.0 && val2 != 0.0)
172
173 return result;
174}
References float_overflow_error(), float_underflow_error(), and unlikely.
Referenced by box_ar(), cash_mul_float8(), circle_ar(), circle_diameter(), circle_mul_pt(), circle_poly(), float48mul(), float84mul(), float8mul(), line_construct(), line_contain_point(), line_distance(), line_eq(), line_interpt_line(), line_perp(), lseg_crossing(), make_interval(), path_area(), point_div_point(), point_mul_point(), radians(), and size_box().
◆ float8_ne()
| static bool float8_ne ( const float8 val1, const float8 val2 ) | inlinestatic |
|---|
◆ float8_pl()
Definition at line 113 of file float.h.
114{
116
117 result = val1 + val2;
118 if (unlikely(isinf(result)) && !isinf(val1) && !isinf(val2))
120
121 return result;
122}
References float_overflow_error(), and unlikely.
Referenced by box_circle(), box_cn(), circle_above(), circle_below(), circle_box(), circle_distance(), circle_left(), circle_overbelow(), circle_overlap(), circle_overleft(), circle_poly(), circle_right(), float48pl(), float84pl(), float8_combine(), float8_regr_combine(), float8pl(), gist_circle_compress(), gist_circle_consistent(), line_contain_point(), line_interpt_line(), lseg_center(), lseg_inside_poly(), on_ppath(), path_area(), path_length(), point_add_point(), point_div_point(), point_mul_point(), and poly_to_circle().
◆ float8in_internal()
| float8 float8in_internal | ( | char * | num, |
|---|---|---|---|
| char ** | endptr_p, | ||
| const char * | type_name, | ||
| const char * | orig_string, | ||
| struct Node * | escontext | ||
| ) |
Definition at line 395 of file float.c.
398{
399 double val;
400 char *endptr;
401
402
403 while (*num != '\0' && isspace((unsigned char) *num))
404 num++;
405
406
407
408
409
410 if (*num == '\0')
412 (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
413 errmsg("invalid input syntax for type %s: \"%s\"",
414 type_name, orig_string)));
415
416 errno = 0;
417 val = strtod(num, &endptr);
418
419
420 if (endptr == num || errno != 0)
421 {
422 int save_errno = errno;
423
424
425
426
427
428
429
430
431
432
433
435 {
437 endptr = num + 3;
438 }
440 {
442 endptr = num + 8;
443 }
445 {
447 endptr = num + 9;
448 }
450 {
452 endptr = num + 9;
453 }
455 {
457 endptr = num + 3;
458 }
460 {
462 endptr = num + 4;
463 }
465 {
467 endptr = num + 4;
468 }
469 else if (save_errno == ERANGE)
470 {
471
472
473
474
475
476
477
478
479
480
481
482 if (val == 0.0 || val >= HUGE_VAL || val <= -HUGE_VAL)
483 {
484 char *errnumber = pstrdup(num);
485
486 errnumber[endptr - num] = '\0';
488 (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
489 errmsg("\"%s\" is out of range for type double precision",
490 errnumber)));
491 }
492 }
493 else
495 (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
496 errmsg("invalid input syntax for type %s: \"%s\"",
497 type_name, orig_string)));
498 }
499
500
501 while (*endptr != '\0' && isspace((unsigned char) *endptr))
502 endptr++;
503
504
505 if (endptr_p)
506 *endptr_p = endptr;
507 else if (*endptr != '\0')
509 (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
510 errmsg("invalid input syntax for type %s: \"%s\"",
511 type_name, orig_string)));
512
513 return val;
514}
static float8 get_float8_infinity(void)
static float8 get_float8_nan(void)
References ereturn, errcode(), errmsg(), get_float8_infinity(), get_float8_nan(), pg_strncasecmp(), pstrdup(), and val.
Referenced by dependencies_scalar(), executeItemOptUnwrapTarget(), float8in(), and single_decode().
◆ float8out_internal()
| char * float8out_internal | ( | float8 | num | ) |
|---|
Definition at line 537 of file float.c.
538{
541
543 {
546 }
547
550}
int double_to_shortest_decimal_buf(double f, char *result)
Datum ascii(PG_FUNCTION_ARGS)
int pg_strfromd(char *str, size_t count, int precision, double value)
References ascii(), double_to_shortest_decimal_buf(), extra_float_digits, palloc(), and pg_strfromd().
Referenced by cube_out(), float8out(), line_out(), pair_encode(), and single_encode().
◆ float_overflow_error()
Definition at line 86 of file float.c.
87{
89 (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
90 errmsg("value out of range: overflow")));
91}
#define ereport(elevel,...)
References ereport, errcode(), errmsg(), and ERROR.
Referenced by dacos(), dacosd(), dasin(), dasind(), datan(), datan2(), datan2d(), datand(), dcbrt(), dcos(), dcosd(), derf(), derfc(), dexp(), dgamma(), dlgamma(), dlog1(), dlog10(), dpow(), dsin(), dsind(), dsqrt(), dtanh(), dtof(), float4_accum(), float4_dist(), float4_div(), float4_mi(), float4_mul(), float4_pl(), float8_accum(), float8_combine(), float8_dist(), float8_div(), float8_mi(), float8_mul(), float8_pl(), float8_regr_accum(), float8_regr_combine(), and gbt_float8_dist().
◆ float_underflow_error()
Definition at line 94 of file float.c.
95{
97 (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
98 errmsg("value out of range: underflow")));
99}
References ereport, errcode(), errmsg(), and ERROR.
Referenced by dcbrt(), dcosh(), dexp(), dgamma(), dlog1(), dlog10(), dpow(), dsqrt(), dtof(), float4_div(), float4_mul(), float8_div(), and float8_mul().
◆ float_zero_divide_error()
◆ get_float4_infinity()
| static float4 get_float4_infinity ( void ) | inlinestatic |
|---|
◆ get_float4_nan()
| static float4 get_float4_nan ( void ) | inlinestatic |
|---|
◆ get_float8_infinity()
| static float8 get_float8_infinity ( void ) | inlinestatic |
|---|
Definition at line 65 of file float.h.
66{
67
68 return (float8) INFINITY;
69}
Referenced by brin_minmax_multi_distance_float4(), brin_minmax_multi_distance_float8(), compute_range_stats(), datanh(), dcosh(), dsinh(), float8in_internal(), gbt_ts_dist(), get_distance(), gistindex_keytest(), initRectBox(), leftmostvalue_float8(), line_invsl(), line_sl(), NonFiniteIntervalPart(), NonFiniteTimestampTzPart(), numeric_float8(), point_invsl(), point_sl(), size_box(), spg_kd_inner_consistent(), spg_quad_inner_consistent(), and spgbeginscan().
◆ get_float8_nan()
| static float8 get_float8_nan ( void ) | inlinestatic |
|---|
Definition at line 84 of file float.h.
Referenced by dacos(), dacosd(), dasin(), dasind(), datan(), datan2(), datan2d(), datand(), dcos(), dcosd(), dcot(), dcotd(), dgamma(), dpow(), dsin(), dsind(), dtan(), dtand(), float4_accum(), float8_accum(), float8_regr_accum(), float8_regr_combine(), float8in_internal(), hashfloat4(), hashfloat4extended(), hashfloat8(), hashfloat8extended(), line_closept_point(), numeric_float8(), numeric_float8_no_overflow(), and point_box_distance().
◆ is_infinite()
Definition at line 118 of file float.c.
119{
120 int inf = isinf(val);
121
122 if (inf == 0)
123 return 0;
124 else if (val > 0)
125 return 1;
126 else
127 return -1;
128}
References val.