r - R是否在内部将数字视为双倍?
问题描述
R是否主要将数字视为双倍?
以下代码表明 R 将数字视为双精度数。即使我将其设为整数,经过一些计算后它也很容易变成两倍。(代码1)
此外,即使结果看起来像整数,内部也被视为双精度数。(代码2)
我的理解对吗?
代码 1:
> typeof(5)
[1] "double"
> typeof( 5 / 1 )
[1] "double"
> typeof( as.integer(c(1,2,3)) )
[1] "integer"
> typeof( as.integer(c(1,2,3)) + 1 )
[1] "double"
> typeof( as.integer(c(1,2,3)) / 1 )
[1] "double"
代码 2:
> 1 + 2
[1] 3
> typeof( 1 + 2)
[1] "double"
解决方案
R 以不同的方式处理数字。在 R 中,整数和双精度浮点数都默认为其 32 位版本。
正如 Andrey 所指出的,R 中有两种不同类型的数字。
- 字面
1L, 2L, 3L, ....
量,这相当于as.integer(1)
- 常规数字(1、2、3.4,实际上是任何数字)
以及它们的复杂对应物。
文字本身就是整数
typeof(1) #double
class(1) #numeric
typeof(1L) #integer
class(1L) #integer
定义明确。但是在计算时,如果计算的任何部分没有存储为小于或等于整数的类型,它将自动转换为双精度:
typeof(1L + 1L) #integer
typeof(1L + 1) #double
typeof(1L + TRUE) #integer
typeof(1L * 3) #double
typeof(1L * 3L) #integer
但是应该注意,由于 R 使用 32 位变量运行,与 python 3.x 相比,这些变量的范围有限。bit64
然而,人们可以通过使用64 位整数的包来绕过 32 位变量(在大多数情况下!) ,Rmpfr
它提供了一个任意浮点精度的接口(根据他们的文档)。
编辑
我错误地指出“在 R 中,整数和双精度浮点数都默认为其 32 位版本”。双精度变量不是这种情况,现在几乎所有的 R 版本都默认为 64 位对应的变量。
推荐阅读
- button - 如何在 Apache Royale Jewel Button 上设置焦点?
- react-native - 如何在 React Native 中使用数据调用变量
- symfony - Symfony 4 allow_extra_fields 设置为 true 但仍在获取 - 此表单不应包含额外字段
- php - 如何显示元素的长度
- javascript - 是否可以有条件地链接 populate() 方法调用?
- .net - 如何处理 PostgreSQL 的 timestamptz 中的 TIMEZONE
- javascript - Discord.js 通过现有函数删除消息
- bash - 在 bash 中配置配置文件
- r - 如何找到下一步要走
- apache - .htaccess 重写 - 删除所有扩展