将浮点数拆分为固定精度的浮点数之和

Splitting a floating point number as sums of floating point of fixed precision

提问人:user8469759 提问时间:6/23/2015 更新时间:6/23/2015 访问量:100

问:

假设我有一个算法,通过该算法,我可以计算出无限精确的浮点数(取决于参数 N),让我们在伪代码中说:

arbitrary_precision_float f = computeValue(n); //it could be a function which compute a specific value, like PI for instance.

我想我可以用 gnump 库的库 mpf 实现,例如......computeValue(int)

无论如何,我怎样才能将这样的数字拆分为浮点数的总和,其中每个数字都有尾数数字?L

//example
f = x1 + x2 + ... + xn;
/*
for i = 1:n
  xi = 2^ei * Mi
 Mi has exactly p digits.
*/

我不知道我是否清楚,但我正在寻找一些“简单”的东西。

算法 精度 浮点转换

评论

0赞 Petr 6/23/2015
为什么不简单地将(二进制)符号拆分为数字组呢?fp
0赞 user8469759 6/23/2015
因为规范化的东西?
0赞 Petr 6/23/2015
对不起,你能澄清一下吗?
0赞 user8469759 6/23/2015
如果数字在固定点,我想你可以简单地按照你说的去做。在浮点数的情况下,我的意思是从“f”派生一个或多个浮点数,其中精度固定为参数“p”,这意味着此外,为每个此类值派生一个指数。例如。。。假设你有一个浮点“f”,其中尾数(前导为 1)10010001如果我应用直线拆分,我有 x1 和尾数 1001,x2 和尾数 0001,x2 没有归一化,此外我需要推导每个的指数。
0赞 Petr 6/23/2015
指数可以很容易地从原始尾数中分裂部分的位置推导出来。之后,如果某个值以 0 开头,您可以移动其值并更改其指数(使 x2=1000 并将指数减去 3)。或者,如果你想要,比如说,这些数字的最小数量,那么这是一个单独的问题。

答:

0赞 Petr 6/23/2015 #1

您可以使用非常简单的算法。在不损失一般性的情况下假设原始数字的指数为零;如果不是,那么您只需将该指数添加到答案的所有指数中即可。

将您的号码分成几组数字,并将每组视为单独的 .任何这样的群都可以用你需要的形式表示:尾数将正是该群,指数将被否定该群在原始数中的起始位置(即,,其中 是群数)。fLxii*Li

如果任何结果 s 从零开始,您只需移动其尾数并相应地校正指数即可。xi

例如,对于L=4

f = 10010011100
    1001     
        0011 
            100
-> x1=1.001 *2^0
   x2=0.011 *2^{-4} = 1.1*2^{-6}
   x3=1.00  *2^{-8}

如果您想尽量减少获得的数字数量,就会出现另一个问题。在上面的示例中,两个数字就足够了:.这是一个单独的问题,实际上是动态规划的简单问题。1.001*2^0+1.11*2^{-6}

评论

0赞 user8469759 6/23/2015
在最小化我得到的数字量的情况下怎么办?出于好奇,它可能很有用。
0赞 Petr 6/23/2015
@Lukkio,阅读一些关于动态规划的内容。一旦你把 0 和 1 看作是序列,它就变成了一个简单的 DP 问题。f