求和时的归一化值大于1

时间:2015-11-06 21:45:51

标签: linux python-2.7 normalization multiplication

我有两个文件:

文件1:

  TOPIC:topic_0 1294
  aa 234
  bb 123

  TOPIC:topic_1 2348
  aa 833
  cc 239
  bb 233

文件2:

0.1 0.2 0.3 0.4 

这只是我文件的格式。基本上,当第二列(省略第一个“TOPIC”行)对每个主题求和时,它构成1,因为它们是标准化值。类似地,在文件2中,值被归一化,因此它们也构成1.

我执行文件1和2中的值的乘法。结果输出文件如下所示:

aa 231
bb 379
cc 773

当输出文件求和时,第二列应该给出1.但很少有文件的值略高于1,如1.1,1.00038。如何为输出文件精确地获得1?我应该做些什么或其他什么?

PS:格式只是示例,值和单词不同。这只是为了理解目的。请帮我解释一下。

1 个答案:

答案 0 :(得分:1)

Python将浮点小数存储在base-2中。

https://docs.python.org/2/tutorial/floatingpoint.html

这意味着一些小数可能在base-10中终止,但在base-2中重复,因此在添加它们时会出现浮点错误。

这进入了一些数学,但想象在基数10试图表达值2/6。当你从分子和分母中消除公因子时它是1/3。

这是0.333333333 .....永远重复。我会在一瞬间解释原因,但是现在,明白如果只存储十进制的前16位数,例如,当你将数字乘以3时,你将得不到1,你将得到.9999999999999999 ,这有点偏。

只要有重复的小数,就会发生这种舍入错误。

这就是为什么你的数字不会在基数为10的情况下重复,但它们会在基数为2的情况下重复。

小数位于10的基数,其中素数因子为2 ^ 1 * 5 ^ 1。因此,对于以10为基数终止的任何比率,其分母必须是2和5的组合的素数因子,而不是别的。

现在让我们回到Python。每个小数都存储为二进制。这意味着,为了使比率的“十进制”终止,分母必须将因子仅为2而不是其他。

您的号码在基数2中重复。

1/10在分母中有(2 * 5)。 2/10减少到1/5,分母中仍有5个。 3月10日......你明白了。