在 Erlang/OTP 27 中,+0.0 将不再完全等于 -0.0


Erlang/OTP 技术委员会宣布,在 Erlang/OTP 27 中,,+0.0 将不再完全等于 -0.0。

在此之前,Erlang 的浮点数0.0-0.0具有不同的内部表示。如果将它们转换为二进制文件,则可以看到:

<<0.0/float>>.
<<0,0,0,0,0,0,0,0>>

<<-0.0/float>>.
<<128,0,0,0,0,0,0,0>>

但是,当它们相互匹配或使用=:=运算符进行比较时,却会被认为是相等的,0.0 =:= -0.0会返回 true。

Erlang 团队一直在犹豫是否要花时间和人力去处理这个问题。但最近的一个 Bug 让这个问题变得更严重,Erlang 编译器的优化程序会将此函数中两个子句的代码视为重复代码:

f(_V0, _V0) ->
-0.0;
f(_, _) ->
0.0.

并自动将其重写为:

f(_, _) ->
0.0.

在 =:= 运算符持续认为 0.0 和 -0.0 是完全相等时,修复此优化会将很麻烦,并且可能会使编译器变慢。编译器中的其他优化也可能会受到影响。

在经过慎重的评判和讨论后,Erlang /OTP 技术委员会决定,在 Erlang/OTP 27 中,将更改 +0.0 =:= -0.0 以使其返回 false ,且正负 0.0 相互匹配也会失败。当用作映射键时, 0.0-0.0 也将被识别为两个不同的键。当然,== 运算符将继续为 0.0 == -0.0 返回 true

在 OTP 27 中,当与 0.0 匹配或使用 =:= 运算符与该值进行比较时,将出现新的编译器警告。可以通过匹配 +0.0 而不是 0.0 来抑制警告。Erlang 团队还计划在 OTP 26.1 中引入相同的警告,但默认情况下它将被禁用。如果有人怀疑自己的代码会受到影响,可以在 OTP 26.1 中打开该警告。

有关 Erlang 与浮点数的更多技术细节,可以在该讨论帖子中细阅。


相關推薦

2022-09-23

Erlang/OTP 25.1 是 OTP 25 的第一个维护补丁包,主要包含错误修复以及许多小改进。 Erlang 是一种通用的并发函数式程序设计语言。Erlang 也可以指 Erlang/OTP 的通称,开源电信平台 (OTP) 是 Erlang 的常用执行环境及一系列标准组件。

2022-05-19

Erlang/OTP 25.0 已发布,这是一个新的重要版本,带来了新特性、改进和修复,当然也包含一些不兼容的改动。 Erlang 是一种通用的并发函数式程序设计语言。Erlang 也可以指 Erlang/OTP 的通称,开源电信平台 (OTP) 是 Erlang 的常用执

2023-03-13

Erlang/OTP 25.3 是 OTP 25 的第三个维护补丁包,主要包含错误修复以及功能改进。 Erlang 是一种通用的并发函数式程序设计语言。Erlang 也可以指 Erlang/OTP 的通称,开源电信平台 (OTP) 是 Erlang 的常用执行环境及一系列标准组件。

2023-05-18

Erlang/OTP 26.0 已正式发布。 Erlang 是一种通用的并发函数式程序设计语言。Erlang 也可以指 Erlang/OTP 的通称,开源电信平台 (OTP) 是 Erlang 的常用执行环境及一系列标准组件。 这是一个重要版本更新,包含许多新特性、改进和不

2022-12-22

Erlang/OTP 25.2 是 OTP 25 的第二个维护补丁包,主要包含错误修复以及小改进。 Erlang 是一种通用的并发函数式程序设计语言。Erlang 也可以指 Erlang/OTP 的通称,开源电信平台 (OTP) 是 Erlang 的常用执行环境及一系列标准组件。 主

2023-02-18

Erlang/OTP 26.0 发布了首个 RC。 Erlang 是一种通用的并发函数式程序设计语言。Erlang 也可以指 Erlang/OTP 的通称,开源电信平台 (OTP) 是 Erlang 的常用执行环境及一系列标准组件。 主要变化 改进 Shell 该版本针对 Shell 添加了许多

2022-09-06

及优化编译时间和错误信息。 另外,Elixir v1.14 是支持 Erlang/OTP 23 的最后一个版本。建议开发者考虑升级到 Erlang/OTP 24 或 Erlang/OTP 25。     dbg Kernel.dbg/2是一个新的宏,有点类似于IO.inspect/2,专门为调试而定制。

2023-04-03

QP)的开源实现,由以高性能、健壮以及可伸缩性出名的 Erlang 编写而成,RabbitMQ 也继承了这些优点。 RabbitMQ 3.11.13  是 RabbitMQ 3.11 的维护版本,支持的最低 Erlang 版本是 Erlang 25,RabbitMQ 和 Erlang/OTP 兼容性矩阵有更多详细信息

2023-04-28

QP)的开源实现,由以高性能、健壮以及可伸缩性出名的 Erlang 编写而成,RabbitMQ 也继承了这些优点。 RabbitMQ 3.11.14  是 RabbitMQ 3.11 的维护版本,支持的最低 Erlang 版本是 Erlang 25,RabbitMQ 和 Erlang/OTP 兼容性矩阵有更多详细

2023-02-07

的生成和查询实现。 ip2region 2.10.0 更新如下: 1、增加 erlang binding 实现:https://github.com/lionsoul2014/ip2region/tree/master/binding/erlang 默认的 bench 测试结果如下: $ cd benchmarks/ $ sh xdb-benchmark.sh ===> Verifying dependencies... ===> Analyzing a

2021-11-11

同的a,b值"; } ?> 解法1: 也可以传入两个数组,但不再适合传入两个0e开头的字符串,因为===是md5的强碰撞,进行了严格的过滤。 解法2: 使用md5加密后两个完全相等的两个字符串来绕过过滤。 如何生成两个不一

2023-09-06

值 Web 端 wasm 文件和 Google 字体文件修改问从本地加载,不再从 Google 下载 福利 目前我的 OpenAI 账户还有大约 4900+ 美金的额度,为了感谢各位 V 友的关注,在满足以下几个条

2023-02-28

个更快、更现代的接口。 其他一些新的更改: 内核不再提供允许进程读取或写入其他进程内存的系统调用。 在支持它的 EFI 系统上,现在指示固件在重新启动时擦除所有内存,以阻止冷启动攻击。 Landlock 支持已启用。

2022-11-30

/粘贴数字。 UI:修复了界面状态中的各种不一致 UI:不再可能让管理监听器与文件传输协议服务器监听器发生冲突。如果配置文件中预先存在冲突,管理侦听器优先,因此仍然可以更改 FileZilla Server 的配置。 UI:在某些极

2023-02-10

osId!! 当然还有很多分布式场景需要分布式 ID,这里不再一一列举。 分布式 ID 方案的核心指标 全局(相同业务)唯一性:唯一性保证是 ID 的必要条件,假设 ID 不唯一就会产生主键冲突,这点很容易可以理解