归一化值,加起来大于 1
Normalized values, when summed are more than 1
我有两个文件:
文件 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: 格式仅为示例,数值和字词不同。这仅用于理解目的。请帮我整理一下。
Python 以 2 进制存储浮点小数。
https://docs.python.org/2/tutorial/floatingpoint.html
这意味着某些小数可能以 10 为底终止,但以 2 为底重复,因此在将它们相加时会出现浮点错误。
这涉及到一些数学问题,但想象一下以 10 为基数试图表达 2/6 的值。当您从分子和分母中消除公因子时,它是 1/3。
它是 0.333333333..... 永远重复。我稍后会解释为什么,但现在,请理解如果只存储小数点的前 16 位,例如,当您将数字乘以 3 时,您不会得到 1,您将得到 .9999999999999999 ,有点偏了。
只要有重复的小数,就会出现此舍入错误。
这就是为什么您的数字不以 10 进制重复,但以 2 进制重复。
小数以 10 为底,素因数为 2^1 * 5^1。因此,对于以 10 为底的任何比率,其分母必须是 2 和 5 的组合的质因数,除此之外别无其他。
现在让我们回到Python。每个小数都存储为二进制。这意味着为了使比率的 "decimal" 终止,分母必须仅是 2 的质因数。
您的号码以 2 为基数重复。
1/10 的分母为 (2*5)。
2/10 减少到 1/5,分母仍然是 5。
3/10...好吧,你明白了。
我有两个文件:
文件 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: 格式仅为示例,数值和字词不同。这仅用于理解目的。请帮我整理一下。
Python 以 2 进制存储浮点小数。
https://docs.python.org/2/tutorial/floatingpoint.html
这意味着某些小数可能以 10 为底终止,但以 2 为底重复,因此在将它们相加时会出现浮点错误。
这涉及到一些数学问题,但想象一下以 10 为基数试图表达 2/6 的值。当您从分子和分母中消除公因子时,它是 1/3。
它是 0.333333333..... 永远重复。我稍后会解释为什么,但现在,请理解如果只存储小数点的前 16 位,例如,当您将数字乘以 3 时,您不会得到 1,您将得到 .9999999999999999 ,有点偏了。
只要有重复的小数,就会出现此舍入错误。
这就是为什么您的数字不以 10 进制重复,但以 2 进制重复。
小数以 10 为底,素因数为 2^1 * 5^1。因此,对于以 10 为底的任何比率,其分母必须是 2 和 5 的组合的质因数,除此之外别无其他。
现在让我们回到Python。每个小数都存储为二进制。这意味着为了使比率的 "decimal" 终止,分母必须仅是 2 的质因数。
您的号码以 2 为基数重复。
1/10 的分母为 (2*5)。 2/10 减少到 1/5,分母仍然是 5。 3/10...好吧,你明白了。