计算 32 位浮点表示和相关损失的快速方法

问题描述 投票:0回答:1

我正在处理来自高精度系统的给定范围(即经度和纬度)的实数,该系统会给我很多小数(通常为 15 位,当然加上逗号左边最多三位数字)。现在,我不知道这些小数代表了多少实际知识,但我想全部使用它们。

问题是,对于任何给定的数字,如何快速知道 32 位浮点表示是否会导致小数点位置上的损失,如果是,损失是多少?有没有一些在线工具可以做到这一点,或者我可以在 Excel 工作表或其他东西中进行一些快速计算?

floating-point precision
1个回答
0
投票

不要试图找到十进制损失,让我们看看常见的float32

float64
采用
二进制
浮点编码的二进制损失。

与角度的这种情况一样,范围并不是什么大问题,请考虑提取

float64
的有效数并与保留的位相比评估其最低有效位。

#include <math.h>

#define DBL_FLT_DIG_DIFF (DBL_MANT_DIG - FLT_MANT_DIG)
#define DBL_FLT_DIG_DIFF_MOD (1ull << DBL_FLT_DIG_DIFF)

double double_to_float_loss(double x) {
  if (x < 0) {
    return double_to_float_loss(-x);
  double scale = 1ull << DBL_MANT_DIG;
  int expo;
  // The frexp functions break a floating-point number into a normalized
  // fraction and an integer exponent
  long long ifraction = (long long) (frexp(x, &expo) * scale);
  long long loss = ifraction % DBL_FLT_DIG_DIFF_MOD;
  ifraction /= DBL_FLT_DIG_DIFF_MOD;
  return 1.0 * loss/ifraction';
}

  
  
  


© www.soinside.com 2019 - 2024. All rights reserved.