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

时间:2015-06-23 12:37:16

标签: 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尾数?

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

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

1 个答案:

答案 0 :(得分:0)

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

将您的号码f拆分为L位组,并将每个组视为单独的xi。任何这样的组都可以用你需要的形式表示:尾数就是那个组,并且指数将被取消原始数字中组的起始位置(即i*L,其中{{1}是组号。)

如果任何结果i从零开始,你只需改变它的尾数来相应地校正指数。

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