python - Python 中的浮点值与记录值

标签 python floating-point nlp probability floating-accuracy

我正在计算单词的相对频率(单词数/单词总数)。这会产生相当多的非常小的数字(例如1.2551539760140076e-05)。我已经阅读了有关在这种情况下使用 float 的一些问题,例如在这个article

A float has roughly seven decimal digits of precision ...

有些人建议改用记录的值。我要把这些数字相乘并且想知道

  • 一般来说,Python 中应该遵循七位数规则吗?
  • 就我而言,我应该使用日志值吗?
  • 如果我不这样做,可能会发生什么不好的事情 - 只是不太准确的值或直接错误,例如乘法?
  • 如果是这样,我是否只需使用 math.log() 转换 float - 我觉得此时信息已经丢失了?

非常感谢任何帮助!

最佳答案

那篇文章讨论了 C 中的 float 类型,它是一个 32 位数量。 Python 类型 float 是一个 64 位数字,就像 C 的 double 一样,因此可以存储大约 17 个十进制数字(53 个小数位,而不是 C 的 float< 的 24 位)/)。虽然对于某些应用程序来说,这也可能是精度太低,但它比 32 位 float 要好得多。

此外,由于它是浮点格式,因此像1.2551539760140076e-05(实际上并没有那么小)这样的小数字并不是天生的劣势。虽然只能表示大约 17 位十进制数字,但这 17 位数字不一定是小数点后的前 17 位数字。可以这么说,它们可以移动1。事实上,当您将数字表示为一堆十进制数字乘以 10 的幂 (e-5) 时,您使用了相同的浮点(小数)点概念。举个极端的例子,1-300可以很好地表示2,10300也可以——只有当这两个数字相遇时,才会出现问题(1e300 + 1e-300 == 1e300)。

对于对数表示,您将尽早获取所有值的对数,并在对数空间中执行尽可能多的计算。在您的示例中,您将单词的相对频率计算为 log(word_count) - log(total_words),这与 log(word_count/total_words) 相同,但是可能更准确。

What bad things could happen if I don't -- just a less accurate value or straight up errors, e.g. in the multiplication?

我不知道有什么区别。数值计算可以具有几乎完美的精度(相对舍入误差在 2-50 或更高的范围内),但不稳定的算法在某些情况下也可能给出可笑的糟糕结果。每个单独运算的舍入误差都有相当严格的界限3,但在较长的计算中,它们会以令人惊讶的方式相互作用,从而导致非常大的误差。例如,即使只是对大量 float 求和也可能会引入显着的误差,特别是当它们的大小和符号非常不同时。可靠数值算法的正确分析和设计本身就是一门艺术,我在这里无法公正地评价,但由于 IEEE-754 的良好设计,大多数算法通常锻炼一下好吧。不要太担心它,但也不要忽视它。

<小时/>

1 实际上,我们正在谈论 53 个二进制 数字被移动,但这对于这个概念来说并不重要。存在十进制浮点格式。

2 相对舍入误差小于 2-54,这种情况发生在分母不是 2 的幂的任何分数上,包括诸如此类的普通分数1/3 或 0.1

3 对于基本的算术运算,舍入误差应该是最后一位的半个单位,即结果必须精确计算,然后正确舍入。对于超越函数,误差很少会超过最后一位的一两个单位,但可能会更大。

关于python - Python 中的浮点值与记录值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36959975/

相关文章:

python - 列上的 Multiindiex str 替换

python - 找到方差最大的股票并将其与数据框的第一列交换

floating-point - 没有下溢和溢出,是否有任何2个数字,其中A < B为十进制形式,但转换为 float 后A> B?

c - float 在 c 中打印出负 0

java - NLP新手,关于注解的问题

python - 在 Django Python 中用整数更新空字段

python - 生成一个 2 的幂的 NumPy 数组

math - float 学有问题吗?

java - 在 Lucene 中对词级注释层进行索引和搜索

python - 为什么在达到 200 万个单词时向 gensim 词典添加文档会变慢?