【问题标题】:Splitting a floating point number as sums of floating point of fixed precision将浮点数拆分为固定精度浮点的总和
【发布时间】:2015-09-09 06:23:50
【问题描述】:

假设我有一个算法,我可以通过它计算一个无限精确的浮点数(取决于参数 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 的(二进制)符号分成p 数字组?
  • 因为标准化的东西?
  • 抱歉,您能再澄清一下吗?
  • 如果数字是固定的,我想你可以简单地按照你说的做。在浮点数的情况下,我的意思是从“f”派生一个或多个浮点数,其中精度固定为参数“p”,这意味着还为每个这样的值派生一个指数。例如...假设您有一个浮点“f”,其中尾数(前导 1)为 10010001,如果我应用直接拆分,我有 x1 与尾数 1001 和 x2 与尾数 0001,x2 未标准化,而且我需要导出每个指数的指数。
  • 指数可以很容易地从原始尾数中分割部分的位置推导出来。之后,如果某个值以 0 开头,您只需移动其值并更改其指数(使 x2=1000 并将指数减 3)。或者,如果您想要最少数量的此类数字,那么这是一个单独的问题。

标签: algorithm floating-point floating-accuracy floating-point-conversion


【解决方案1】:

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

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

如果任何结果 xis 从零开始,您只需移动其尾数以相应地校正指数。

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

【讨论】:

  • 在尽量减少我得到的号码的情况下怎么办?出于好奇,它可能很有用。
  • @Lukkio,阅读一下动态规划。一旦将f 视为0 和1 的序列,它就会变成一个简单的DP 问题。
猜你喜欢
  • 2020-02-03
  • 1970-01-01
  • 1970-01-01
  • 2012-11-05
  • 2017-02-19
  • 2011-11-17
  • 2010-12-26
  • 2015-07-01
  • 2010-10-05
相关资源
最近更新 更多