给定两个浮点数,p
和q
其中0 < p < q
我有兴趣编写一个找到“最简单”数字partition(p,q)
的函数r
在p
和q
之间。例如:
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)。
答案 0 :(得分:3)
我们假设p
和q
都是标准化和正数,p < q
。
如果p
和q
有不同的指数,那么您要查找的数字似乎是通过将q
的尾数归零(通常是隐含的)后获得的数字1.角落案例留作练习,特别是q
的尾数已经由前导后的零点组成,可能是隐含的1
。
如果p
和q
具有相同的指数,那么我们必须查看它们的尾数。这些尾数有一些共同点(从最重要的一端开始)。让我们将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.0000...
,而不是0.1111...
),p
必须为0且q
必须为p < q
后的1:
q
在此之后有1位数字,那么此时加1,您就完成了。q
在此点之后没有更多1位数,那么这样做会导致r == q
被禁止,所以改为追加0位数。除非这样做会导致r == p
,在此情况下会追加另一个0然后再追加1。基本上,我们将q
截断到p
和q
不同的第一个位置,然后在必要时稍微跳过它以避免r == p
或{{1 }}。结果当然小于r == q
且大于q
。这是最简单的&#34; (具有最少可能的1位数)因为p
和p
之间的任何数字必须共享它们的公共初始序列。我们只向该序列添加了一个1位数,这是必要的,因为单独的初始序列是q
,因此范围<= p
中的值没有1位数。我们选择了最大的&#34;解决方案,因为我们总是将额外的1放在第一个(最大)可能的地方。
答案 2 :(得分:0)
听起来你只想将严格小于最大参数的最大整数的二进制表示转换为相应的2的幂和。