提问人:user8469759 提问时间:6/23/2015 更新时间:6/23/2015 访问量:100
将浮点数拆分为固定精度的浮点数之和
Splitting a floating point number as sums of floating point of fixed precision
问:
假设我有一个算法,通过该算法,我可以计算出无限精确的浮点数(取决于参数 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
#1
您可以使用非常简单的算法。在不损失一般性的情况下假设原始数字的指数为零;如果不是,那么您只需将该指数添加到答案的所有指数中即可。
将您的号码分成几组数字,并将每组视为单独的 .任何这样的群都可以用你需要的形式表示:尾数将正是该群,指数将被否定该群在原始数中的起始位置(即,,其中 是群数)。f
L
xi
i*L
i
如果任何结果 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
评论
f
p