首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >求取封闭浮点数之间的“离散”差

求取封闭浮点数之间的“离散”差
EN

Stack Overflow用户
提问于 2011-05-31 22:06:59
回答 2查看 750关注 0票数 4

假设我有两个浮点数,xy,它们的值非常接近。

在计算机上可以表示一个离散的浮点数,所以我们可以按升序枚举它们:f_1, f_2, f_3, ...。我希望在这个列表中找到xy的距离(即它们是1,2,3,...或者n离散的步骤分开?)

是否可以只使用算术运算(+-*/),而不查看二进制表示法?我主要感兴趣的是这在x86上是如何工作的。

假设y > xxy之间只有几步(比方说< 100)的距离,下面的近似是正确的吗?(可能不是...)

代码语言:javascript
复制
(y-x) / x / eps

这里eps表示机器epsilon。(机器epsilon是1.0和下一个最小浮点数之间的差值。)

EN

回答 2

Stack Overflow用户

发布于 2012-01-16 11:56:19

浮点数是按字典顺序排序的,因此:

代码语言:javascript
复制
int steps(float a, float b){

  int ai = *(int*)&a;  // reinterpret as integer
  int bi = *(int*)&b;  // reinterpret as integer
  return bi - ai;
}

steps(5.0e-1, 5.0000054e-1);  // returns 9

比较浮点数时使用Such a technique

票数 3
EN

Stack Overflow用户

发布于 2011-06-01 00:59:32

你不必直接检查二进制表示,但我认为你必须依靠它来获得准确的答案。

首先使用frexp()将x分解为指数exp和尾数。我相信下一个比x大的浮点数是x + eps * 2^(exp-1)。( "-1“是因为frexp返回范围为[1/2,1)的尾数,而不是[1,2])。)

如果x和y有相同的指数,你基本上就完成了。否则,你需要计算2的幂有多少步,这就是1.0/eps。换句话说,2^n和2^2(n+1)之间的步数是1.0/eps

所以,对于y > x,计算从x到2的下一个幂的步数;然后计算到2的最大幂减去y需要多少步;然后计算从那里到y需要多少步,我认为所有这些都很容易用eps表示。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6188822

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档