如何确定二进制数小数部分的平移精度?

时间:2015-02-03 05:38:19

标签: c++ algorithm floating-accuracy radix

我在十进制系统中有一个数字。输入double。我使用循环的小数部分将其翻译为赔率,它看起来像这样:

double part;
part = part - int(part);
        for (auto i = 0; i < ACCURACY; i++) //Точность
        {
            part *= typeEncode;

            result += std::to_string(int(part));
            if (part >= typeEncode / 2)
            {
                part -= int(part);
            }
        }

我转移了这个号码:

double E1 = 0.15625;

事实证明我发现元素的数量与ACCURACY相等。如何计算每个数字唯一的精度数?然后是额外的零或割礼二进制数。

1 个答案:

答案 0 :(得分:2)

double的内部表示不是十进制的,它已经是二进制的,它是由国际标准IEEE 754定义的。所以double是64位且由3部分组成:符号(1位),指数(11位)和有效数(52位)。

粗略地说,这种分离允许以相同的精度存储非常小和非常大的数字:指数包含有关幅度和有效数的信息,并存储实际值。

这就是为什么我们立即看到你的程序问题的原因:首先你只采取小部分,这里丢失一些信息,你不知道丢失了多少。然后你尝试进行某种转换a-la&#34;除以并征服&#34;,但问题是比例:如果你将区间[0,1]分成两个相等的部分[0,0.5]和[0.5,1],第一个中会有更多的数字。

一个好的开头可能就是article(俄语),或英语维基百科article on double-precision numbers。在理解了内部表示之后,您可能能够通过简单的逻辑运算(例如&>>)提取所需的位。如果您需要用于十进制到二进制转换的生产质量代码,我建议使用此库:https://github.com/floitsch/double-conversion