假设我有两个浮点数,x和y,它们的值非常接近。
在计算机上可以表示一个离散的浮点数,所以我们可以按升序枚举它们:f_1, f_2, f_3, ...。我希望在这个列表中找到x和y的距离(即它们是1,2,3,...或者n离散的步骤分开?)
是否可以只使用算术运算(+-*/),而不查看二进制表示法?我主要感兴趣的是这在x86上是如何工作的。
假设y > x和x和y之间只有几步(比方说< 100)的距离,下面的近似是正确的吗?(可能不是...)
(y-x) / x / eps这里eps表示机器epsilon。(机器epsilon是1.0和下一个最小浮点数之间的差值。)
发布于 2012-01-16 11:56:19
浮点数是按字典顺序排序的,因此:
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。
发布于 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表示。
https://stackoverflow.com/questions/6188822
复制相似问题