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

Algorithm 将浮点数拆分为固定精度的浮点数和,algorithm,floating-point,floating-accuracy,floating-point-conversion,Algorithm,Floating Point,Floating Accuracy,Floating Point Conversion,假设我有一个算法,通过它我可以计算出一个无限精确的浮点数(取决于参数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尾数位数,我如何将这些数字拆分为浮点数之和 //exam

假设我有一个算法,通过它我可以计算出一个无限精确的浮点数(取决于参数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.
*/

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

你可以使用一个非常简单的算法。在不丧失一般性的前提下,假设原始数字的指数为零;如果不是,那么你只需要把这个指数加到答案的所有指数上

将您的号码
f
分成
L
数字组,并将每个数字组视为单独的
xi
。任何这样的组都可以用您需要的形式表示:尾数将正好是该组,而指数将是该组在原始编号中的起始位置的负数(即,
i*L
,其中
i
是组编号)

如果得到的任何一个
xi
s从零开始,只需移动其尾数,相应地修正指数

例如,对于
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}
。这是一个单独的问题,事实上是动态规划的一个简单问题。

为什么不简单地将
f
的(二进制)符号分成
p
数字组?因为规范化的东西?对不起,你能澄清更多吗?如果数字是在固定点,我想你可以简单地按照你说的做。在浮点数的情况下,我的意思是从“f”导出一个或多个浮点数,其中精度固定在参数“p”上,这意味着还要为每个此类值导出一个指数。例如假设有一个浮点“f”,其中尾数为10010001,前导为1,如果我应用直线分割,那么x1为尾数1001,x2为尾数0001,x2未标准化,此外,我还需要求出每一个的指数。指数可以很容易地从原始尾数中分裂部分的位置得到。之后,如果某个值以0开头,则只需移动其值并更改其指数(使x2=1000并将指数减小3)。或者,如果你想要,比如说,这些数字的最小数量,那么这是一个单独的问题。在最小化我得到的数量的情况下,怎么做?“出于好奇,它可能很有用。”Lukkio,读一读动态规划。一旦将
f
视为0和1的序列,它就会变成一个简单的DP问题。