PostGIS  3.4.0dev-r@@SVN_REVISION@@

◆ trim_preserve_decimal_digits()

static double trim_preserve_decimal_digits ( double  d,
int32_t  decimal_digits 
)
static

Definition at line 2511 of file lwgeom.c.

2512 {
2513  uint64_t dint = 0;
2514  memcpy(&dint, &d, sizeof(double));
2515  /* Extract the exponent from the IEEE 754 integer representation, which */
2516  /* corresponds to floor(log2(fabs(d))) */
2517  const int exponent = (int)((dint >> 52) & 2047) - 1023;
2518  /* (x * 851 + 255) / 256 == 1 + (int)(x * log2(10)) for x in [0,30] */
2519  int bits_needed = 1 + exponent + (decimal_digits * 851 + 255) / 256;
2520  /* for negative values, (x * 851 + 255) / 256 == (int)(x * log2(10)), so */
2521  /* substract one */
2522  if (decimal_digits < 0)
2523  bits_needed --;
2524 
2525  /* This will also handle NaN and Inf since exponent = 1023, and thus for */
2526  /* reasonable decimal_digits values bits_needed will be > 52 */
2527  if (bits_needed >= 52)
2528  {
2529  return d;
2530  }
2531  if (bits_needed < 1 )
2532  bits_needed = 1;
2533  const uint64_t mask = 0xffffffffffffffffULL << (52 - bits_needed);
2534  dint &= mask;
2535  memcpy(&d, &dint, sizeof(double));
2536  return d;
2537 }

Referenced by lwgeom_trim_bits_in_place().

Here is the caller graph for this function: