假设我有一个算法,通过该算法,我可以计算出一个无限精确的浮点数(取决于参数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 :(得分: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}
。这是一个单独的问题,实际上是动态编程的一个简单问题。