Считает ли R числа двойными внутри? - PullRequest
2 голосов
/ 15 апреля 2019

R рассматривает числа в основном как двойные?

Следующий код предполагает, что R рассматривает числа как двойные.Даже если я сделаю это целым числом, оно легко удваивается после некоторого вычисления.(Код1)

Кроме того, даже если результат выглядит как целое число, оно рассматривается как двойное.(Code2)

Правильно ли мое понимание?

Код 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"

Ответы [ 2 ]

1 голос
/ 15 апреля 2019

R обрабатывает числа по-разному.В R как целые числа, так и значения с плавающей запятой двойной точности по умолчанию равны 32-битной версии.

Как указал Андрей, в R. есть два разных типа чисел.

  1. Литералы 1L, 2L, 3L, ...., что эквивалентно as.integer(1)
  2. обычномучисла (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.Однако можно обойти 32-битные переменные (в большинстве случаев!), Используя пакеты bit64 для 64-битных целых и Rmpfr, что дает интерфейс для произвольной точности с плавающей запятой (согласно их документации).

0 голосов
/ 15 апреля 2019

Чтобы сделать число целым с самого начала, добавьте к нему L:

typeof(1L)
# [1] "integer"

Есть опасность при работе с 32-битными целыми числами:

2e9L
# [1] 2000000000
2e9L + 2e9L
# [1] NA
# Warning message:
# In 2000000000L + 2000000000L : NAs produced by integer overflow
...