【问题标题】:Floating point number representation in binary二进制浮点数表示
【发布时间】:2017-06-16 08:51:34
【问题描述】:

我正在解决Cracking The Coding Interview 中的一个问题,该问题要求:给定一个带有点的二维图,找到一条通过最多点数的线。

解决方案是:在每两点之间画一条无限线,并使用哈希表跟踪哪条线最常见。为了找到最常见的线,我们使用哈希表遍历所有线段来计算我们看到每条线的次数。

作者接着说有一个复杂之处:“如果两条线具有相同的斜率和 y 截距,我们将定义两条线相等。然后,我们将根据这些值对线进行散列(特别是基于斜率)。浮点数的问题不能总是用二进制准确表示。我们通过检查两个浮点数是否在彼此的 epsilon 值内来解决这个问题。"

这就是我感到困惑的地方。即使斜率是一个浮点数,我们不能用它作为哈希键吗?如果是这样,为什么不将斜率散列为字符串呢?为什么我们需要在我们的代码中引入基于彼此 epsilon 内的键的散列?

【问题讨论】:

标签: algorithm hash binary floating-point key


【解决方案1】:

看看下面用 c++ 编写的例子。

#include <stdio.h>
#include <stdlib.h>

int main() {
  double a=10.0;
  double b=a/3;
  double c=(b-3)*3;

  printf("a: %20.50lf\n", a);
  printf("b: %20.50lf\n", b);
  printf("c: %20.50lf\n", c);
  return 0;
}

'c' 应该等于 1,但由于浮点四舍五入,上面的代码会产生以下结果。

a: 10.00000000000000000000000000000000000000000000000000
b: 3.33333333333333348136306995002087205648422241210938
c: 1.00000000000000044408920985006261616945266723632812

【讨论】:

    【解决方案2】:
    1. 您描述的算法不需要任何哈希表。

      改用直方图。此答案是 C++

      中此任务的确切示例
    2. 如果您仍想使用浮点数作为键

      然后您需要截断它们,以便将它们作为二进制进行比较。例如假设你得到(假设 C++ 语法):

      const float da=1.5*M_PI/180.0; // [rad] comparison precision
      float a;
      a=atan2(dy,dx); // [rad] your line angle from deltas
      a=floor(a/da);  // [da] truncated angle
      

      dx,dy 是您的直线增量,da 是您的比较精度角度。现在要访问float a 作为二进制文件进行哈希处理,您可以简单地这样做:

      union { float f32; DWORD u32; } b;
      b.f32=a;
      // here b.u32 is your hash key
      

    【讨论】:

      猜你喜欢
      • 2016-05-01
      • 2015-12-02
      • 2016-01-01
      • 1970-01-01
      • 2018-04-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多