当前位置: 首页 > 知识库问答 >
问题:

为什么Erlang中的“[integerfloat]转换策略会根据float的大小而改变”以及如何观察这种情况?

谷梁镜
2023-03-14

Erlang医生说:

“当将整数与浮点数进行比较时,精度较低的项将转换为另一个项的类型,除非运算符是 =:= 或 =/= 之一。浮点数比整数更精确,直到浮点数的所有有效数字都位于小数点的左侧。当浮点数大于/小于 /-9007199254740992.0 时,会发生这种情况。转换策略会根据浮点数的大小而改变,否则大浮点数和整数的比较将失去其传递性。

我看文件说<代码>(...数字). 0 ==(...数字)对于一小段< code >(...数字)但是对于更大的序列(...数字),但他们给出的值似乎不是这样:

> 9007199254740992.0 == 9007199254740992
true
> 9.0 == 9.
true

然而,对于较大的数字来说,情况似乎确实如此。关于转换策略更改的特定边界,文档是否已经过时?

> 999999999999999999999.0 ==  999999999999999999999.
false
> 9.0 == 9.

真实的

给出了改变浮动策略的原因

共有2个答案

岑元徽
2023-03-14

假设浮点和整数有不同的精度(浮点的值越接近0分辨率越高,离0越远分辨率越低),如果你想比较它们,你需要把它们中的一个转换成另一个。

如果此转换是从精度较高的转换为精度较低的转换,则这是可能的:

H2 = H1 + Delta,
true = L == H1,
true = L == H2,
true = H1 /= H2. %% In this case, both H1 and H2 are equal to L but different between themselves

由于这个原因(传递性),转换以相反的方式执行,从较低的优先级到较高的优先级。

孟翰海
2023-03-14

让我们考虑这三个数字:

A = 9007199254740992.
B = 9007199254740993.
C = 9007199254740992.0.

在实际规则下,AC彼此相等,不同于 :

> A == B.  %% A and B are both integers, compared as integers
false
> A == C.  %% C gets converted to an integer before comparison
true
> B == C.  %% C gets converted to an integer before comparison
false

如果情况正好相反,那么阈值以上的整数在与浮点值进行比较之前被转换为浮点值会怎么样?

> A == B.         %% no change, because they are both integers
false
> float(A) == C.  %% no surprise here
true
> float(B) == C.  %% B cannot be accurately represented as a floating point value!
true

所以现在看起来AB都等于C,但彼此不相等,相等比较失去了传递性。

9007199254740992等于253,53也是64位IEEE 754浮点数< sup>*中的有效位数,因此对于大于此数的数字,浮点类型无法表示每个整数。例如,< code > 9007199254740992.0 1 = = 9007199254740992.0 返回< code>true。这就是为什么Erlang整数类型(它是一个bignum,因此可以表示任意大的整数)被认为比这个阈值更精确。

*二进制表示仅使用52位作为重要值,并且逃脱了惩罚,因为第一位几乎总是1。搜索“次正规数字”以了解更多信息。

 类似资料:
  • 下面是我的pyspark代码: 现在,如果我尝试加载以下文件,该文件大得多,有1391578行: 我得到一个8的分区。 我的问题是如何强制第一个CSV以与较大文件相同的方式进行分区。我知道可以使用重新分区,但我很想知道这是否可以在没有任何洗牌的情况下完成?而且即使我们重新划分它,它似乎创建了一个有3个任务而不是8个任务的作业。

  • 问题内容: 我正在尝试将项目设置为表视图,但是setitems方法需要一个可观察的列表,而我的模型中却有一个可观察的集合.FXCollections实用程序类没有给定可观察的集合来创建可观察的列表的方法。类强制转换异常(按预期)。 目前,我正在使用这种代码 而且我有一些问题: 在表中进行编辑是否会按预期更新基础集? 这是这样做的“正确”方法吗 简而言之,我需要样式指南或最佳做法,以便在可观察集和可

  • 问题内容: 因此,当我发现一些非常奇怪的东西时,我正在使用Node.js REPL和Underscore库。如果I ,则该变量是全局设置的(显然)。然后,当我尝试运行一个简单的命令时,它会打印出来(显然,再次)。但是,此后立即运行,因为变量设置为,它会打印。 为什么这样做呢?如果我从js文件运行相同的代码,则不会发生。这是正常的Node事情,还是全部错误? 仅供参考:节点v0.10.10 问题答案

  • Python中的字符串是不可变的,这意味着该值不能更改。我正在测试该场景,但看起来原始字符串已被修改。我只是想理解这个概念

  • 我有一个java应用程序-一个计算器。我想通过调整应用程序窗口的大小来动态调整按钮的字体大小。如何实现? 我的想法是使用ComponentEvents。我有应用程序窗口的初始大小和初始字体的大小。我想根据按钮的大小改变字体大小,受窗口大小变化的影响。问题是如何在覆盖方法中使用比例[初始窗口大小]/[初始字体大小]?每个字体的比例都不同。