1

我有一个十进制数字。键入双。我使用周期的小数部分来翻译它,它看起来像这样:

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。如何计算每个数字唯一的准确度数?然后是额外的零或包皮环切二进制数。

4

1 回答 1

2

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

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

这就是为什么我们立即看到你的程序的问题:首先你只取小数部分,这里丢失了一些信息,你不知道丢失了多少。然后你尝试做某种转换a-la“分而治之”,但问题是规模:如果你把区间 [0, 1] 分成两个相等的部分 [0, 0.5) 和 [0.5, 1] ,其中第一个会有更多的数字。

一个很好的起点可能是这篇文章(它是俄语的),或者关于双精度数字的英文维基百科文章。在了解了内部表示之后,您可能能够通过简单的逻辑运算(例如&and >>)提取您想要的位。如果您需要用于十进制到二进制转换的生产质量代码,我会推荐这个库:https ://github.com/floitsch/double-conversion 。

于 2015-02-03T07:33:55.980 回答