算法 - 对两个幂的两个数进行分区

时间:2011-10-22 15:07:47

标签: algorithm

给定两个浮点数,pq其中0 < p < q我有兴趣编写一个找到“最简单”数字partition(p,q)的函数rpq之间。例如:

partition(3.0, 4.1) = 4.0 (2^2)
partition(4.2, 7.0) = 6.0 (2^2 + 2^1)
partition(2.0, 4.0) = 3.0 (2^1 + 2^0)
partition(0.3, 0.6) = 0.5 (2^-1)
partition(1.0, 10.0) = 8.0 (2^3)

在最后一个例子中,我对最大数字感兴趣(因此8而不是4或2)。

3 个答案:

答案 0 :(得分:3)

我们假设pq都是标准化和正数,p < q

如果pq有不同的指数,那么您要查找的数字似乎是通过将q的尾数归零(通常是隐含的)后获得的数字1.角落案例留作练习,特别是q的尾数已经由前导后的零点组成,可能是隐含的1

如果pq具有相同的指数,那么我们必须查看它们的尾数。这些尾数有一些共同点(从最重要的一端开始)。让我们将c1 c2 .. ck pk+1 ... pn的尾数p称为c1 c2 .. ck qk+1 ... qn尾数的q,其中c1 .. ck是公共位,{{1} },pk+1不同。然后qk+1为零,pk+1为一(因为假设)。具有相同指数和尾数qk+1的数字位于c1 .. ck 1 0 .. 0区间内,并且是您要查找的数字(同样,作为练习留下的角落情况)。

答案 1 :(得分:1)

  • 以二进制形式写入数字(如果可能,终止,因此1写为1.0000...,而不是0.1111...),
  • 从左向右扫描,&#34;保持&#34;两个数字相等的所有数字
  • 在两个数字不同的第一个数字处,p必须为0且q必须为p < q后的1:
    • 如果q在此之后有1位数字,那么此时加1,您就完成了。
    • 如果q在此点之后没有更多1位数,那么这样做会导致r == q被禁止,所以改为追加0位数。除非这样做会导致r == p,在此情况下会追加另一个0然后再追加1。

基本上,我们将q截断到pq不同的第一个位置,然后在必要时稍微跳过它以避免r == p或{{1 }}。结果当然小于r == q且大于q。这是最简单的&#34; (具有最少可能的1位数)因为pp之间的任何数字必须共享它们的公共初始序列。我们只向该序列添加了一个1位数,这是必要的,因为单独的初始序列是q,因此范围<= p中的值没有1位数。我们选择了最大的&#34;解决方案,因为我们总是将额外的1放在第一个(最大)可能的地方。

答案 2 :(得分:0)

听起来你只想将严格小于最大参数的最大整数的二进制表示转换为相应的2的幂和。