如何判断二进制数的小数部分翻译的准确性?
How to determine the accuracy of the translation of the fractional part of a binary number?
我有十进制的数字。键入双。我用循环的小数部分翻译它,它看起来像这样:
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。我如何计算每个数字唯一的准确度数?然后是额外的零或割礼二进制数。
double
的内部表示不是十进制的,它已经是二进制的,并且是由国际标准IEEE 754定义的。所以double
是64位的,由3部分组成:符号(1 位)、指数(11 位)和有效数(52 位)。
粗略地说,这种分离允许以相同的精度存储非常小和非常大的数字:指数包含有关大小的信息,有效数字存储实际值。
这就是为什么我们立即看到您程序的问题:首先您只取小数部分,这里丢失了一些信息,您不知道丢失了多少。然后你尝试做某种转换 a-la "divide and conquer",但问题是比例:如果你将区间 [0, 1] 分成两个相等的部分 [0, 0.5) 和 [0.5, 1] ,其中第一个数字会更多。
一个好的开始点可能是 article (it's in Russian), or the English Wikipedia article on double-precision numbers. After understanding the internal representation, you'll probably be able to extract the bits you want by simple logical operations (like &
and >>
). If you need production-quality code for decimal-to-binary conversion, I would recommend this library: https://github.com/floitsch/double-conversion。
我有十进制的数字。键入双。我用循环的小数部分翻译它,它看起来像这样:
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。我如何计算每个数字唯一的准确度数?然后是额外的零或割礼二进制数。
double
的内部表示不是十进制的,它已经是二进制的,并且是由国际标准IEEE 754定义的。所以double
是64位的,由3部分组成:符号(1 位)、指数(11 位)和有效数(52 位)。
粗略地说,这种分离允许以相同的精度存储非常小和非常大的数字:指数包含有关大小的信息,有效数字存储实际值。
这就是为什么我们立即看到您程序的问题:首先您只取小数部分,这里丢失了一些信息,您不知道丢失了多少。然后你尝试做某种转换 a-la "divide and conquer",但问题是比例:如果你将区间 [0, 1] 分成两个相等的部分 [0, 0.5) 和 [0.5, 1] ,其中第一个数字会更多。
一个好的开始点可能是 article (it's in Russian), or the English Wikipedia article on double-precision numbers. After understanding the internal representation, you'll probably be able to extract the bits you want by simple logical operations (like &
and >>
). If you need production-quality code for decimal-to-binary conversion, I would recommend this library: https://github.com/floitsch/double-conversion。