热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

添加NA和计算结果为NaN的表达式会根据顺序返回不同的结果,是否违反了交换性?

我正在研究R中数字运算的极端情况。我遇到了以下涉及零除以零的特殊情况:(0/0)+NA#>[1]NaNNA+(0/0)#&g

我正在研究 R 中数字运算的极端情况。我遇到了以下涉及零除以零的特殊情况:

(0/0)+NA
#> [1] NaN
NA+(0/0)
#> [1] NA

由reprex 包( v2.0.0 )于 2021 年 7 月 10 日创建

会话信息

sessionInfo()
#> R version 4.1.0 (2021-05-18)
#> Platform: x86_64-apple-darwin17.0 (64-bit)
#> Running under: macOS Big Sur 10.16
#>
#> Matrix products: default
#> BLAS: /Library/Frameworks/R.framework/Versions/4.1/Resources/lib/libRblas.dylib
#> LAPACK: /Library/Frameworks/R.framework/Versions/4.1/Resources/lib/libRlapack.dylib
#>
#> locale:
#> [1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8
#>
#> attached base packages:
#> [1] stats graphics grDevices utils datasets methods base
#>
#> loaded via a namespace (and not attached):
#> [1] digest_0.6.27 withr_2.4.2 magrittr_2.0.1 reprex_2.0.0
#> [5] evaluate_0.14 highr_0.9 stringi_1.6.2 rlang_0.4.11
#> [9] cli_3.0.0 rstudioapi_0.13 fs_1.5.0 rmarkdown_2.9
#> [13] tools_4.1.0 stringr_1.4.0 glue_1.4.2 xfun_0.23
#> [17] yaml_2.2.1 compiler_4.1.0 htmltools_0.5.1.1 knitr_1.33

这显然违反了加法的交换性质。我有两个问题:


  1. 是否有基于 R 语言定义的这种行为的解释?


  2. 是否有其他不涉及加数子表达式中副作用的违反加法交换属性的例子(包括在其他语言中)?



回答

注意到

0/0
#[1] NaN

+问题中的行为的更一般示例如下:

NA + NaN
#[1] NA
NaN + NA
#[1] NaN

这是在r-devel 线程中,R 核心团队成员Tomas Kalibera 回答了以下问题(我的重点和链接)。

是的,在 R 级别修复此问题的性能开销太大,并且会使代码显着复杂化。涉及 NA 和 NaN 的二元运算的结果取决于硬件(NaN 有效载荷的传播)——在某些硬件上,它实际上按照我们希望的方式工作——返回 NA——但在某些硬件上你得到 NaN 或有时是 NA 有时是 NaN . 还有 C 编译器优化对代码重新排序,如 ?NaN 中所述。然后还有不区分 NA 和 NaN 的外部数值库(NA 是一个 R 概念)。所以恐怕这是无法修复的。邓肯提到的免责声明是在?NaN/?NA 中,我认为这没问题——有太多的数值函数可能会遇到这些问题,以至于无法将它们全部记录下来。有些函数实际上会保留NA,我们不会让NA不必要地变成NaN,但免责声明说这是不依赖的。






回答

?NA,这可能是因为NaN源于0/0

使用 NA 的数值计算通常会导致 NA:一个可能的例外是 NaN 也涉及到,在这种情况下可能会导致(这可能取决于 R 平台)。但是,这并不能保证,未来的 CPU 和/或编译器的行为可能会有所不同。动态二进制转换也可能影响这种行为(使用 valgrind,即使不涉及 NaN,使用 NA 的计算也可能导致 NaN)。







推荐阅读
  • CentOS 6.5安装VMware Tools及共享文件夹显示问题解决方法
    本文介绍了在CentOS 6.5上安装VMware Tools及解决共享文件夹显示问题的方法。包括清空CD/DVD使用的ISO镜像文件、创建挂载目录、改变光驱设备的读写权限等步骤。最后给出了拷贝解压VMware Tools的操作。 ... [详细]
  • 本文介绍了在满足特定条件时如何在输入字段中使用默认值的方法和相应的代码。当输入字段填充100或更多的金额时,使用50作为默认值;当输入字段填充有-20或更多(负数)时,使用-10作为默认值。文章还提供了相关的JavaScript和Jquery代码,用于动态地根据条件使用默认值。 ... [详细]
  • PG12新增的VACUUM命令的SKIP_LOCKED选项
    PG12版本的VACUUM命令新增了SKIP_LOCKED选项,该选项使得vacuum命令在遇到被lock住的table时可以跳过并被视为成功执行。之前的版本中,vacuum命令会一直处于等待状态。本文还提到了PostgreSQL 12.1版本的相关信息。 ... [详细]
  • 在Windows10系统上使用VMware创建CentOS虚拟机的详细步骤教程
    本文详细介绍了在Windows10系统上使用VMware创建CentOS虚拟机的步骤,包括准备条件、安装VMware、下载CentOS ISO文件、创建虚拟机并进行自定义配置、设置虚拟机的ISO与网络、进行安装和配置等。通过本文的指导,读者可以轻松地创建自己的CentOS虚拟机并进行相应的配置和操作。 ... [详细]
  • 用户登录 ... [详细]
  • RMarkdown是一种用于在R中生成可重复生成的报告的开源工具。它可以帮助您将所有代码,结果和编写都放在一个地方,并以有吸引力且易于消化的方式格式化所 ... [详细]
  • 本文介绍了在Windows环境下如何配置php+apache环境,包括下载php7和apache2.4、安装vc2015运行时环境、启动php7和apache2.4等步骤。希望对需要搭建php7环境的读者有一定的参考价值。摘要长度为169字。 ... [详细]
  • CentOS 7部署KVM虚拟化环境之一架构介绍
    本文介绍了CentOS 7部署KVM虚拟化环境的架构,详细解释了虚拟化技术的概念和原理,包括全虚拟化和半虚拟化。同时介绍了虚拟机的概念和虚拟化软件的作用。 ... [详细]
  • Windows 7 部署工具DISM学习(二)添加补丁的步骤详解
    本文详细介绍了在Windows 7系统中使用部署工具DISM添加补丁的步骤。首先需要将光驱中的安装文件复制到指定文件夹,并进行挂载。然后将需要的MSU补丁解压并集成到系统中。文章给出了具体的命令和操作步骤,帮助读者完成补丁的添加过程。 ... [详细]
  • Linux下安装免费杀毒软件ClamAV及使用方法
    本文介绍了在Linux系统下安装免费杀毒软件ClamAV的方法,并提供了使用该软件更新病毒库和进行病毒扫描的指令参数。同时还提供了官方安装文档和下载地址。 ... [详细]
  • java程序设计试题_《Java语言程序设计》期末考试模拟试题——填空题和编程题...
    一、根据题意,填写出空格中的内容Java平台包括三个技术方向,其中J2ME代表____________、J2SE代表___________、J2EE代表 ... [详细]
  • ①页面初始化----------收到客户端的请求,产生相应页面的Page对象,通过Page_Init事件进行page对象及其控件的初始化.②加载视图状态-------ViewSta ... [详细]
  • WPF之Binding初探
      初学wpf,经常被Binding搞晕,以下记录写Binding的基础。首先,盗用张图。这图形象的说明了Binding的机理。对于Binding,意思是数据绑定,基本用法是:1、 ... [详细]
  • ZOC7 for Mac 7.25.6 好用的终端仿真器
    zoc7mac破解版是一个专业的SSH和Telnet客户端和终端模拟软件,以出色的配置和用户界面而闻名。凭借其令人印象深刻的仿真和功能,通过使用选项卡式会话,键入命令历史记录,回滚 ... [详细]
  • html css在线便宜,在线HTML、CSS和JS工具汇总
    本文提供了在线HTML、CSS和JS工具汇总,它们都是直接在浏览器上可以使用的在线工具,基本上都是比较简单操作的,只适合简单的调试工作&# ... [详细]
author-avatar
凹凸妖精铺子
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有