Яка різниця між цілочисельним класом та числовим класом у R


96

Я хочу вступити до цього, сказавши, що я абсолютно новачок у програмуванні, тому, будь ласка, вибачте, наскільки основним є це питання.

Я намагаюся краще зрозуміти "атомні" класи в R, і, можливо, це стосується класів програмування загалом. Я розумію різницю між класами символів, логічними та складними даними, але намагаюся знайти принципову різницю між числовим класом та цілим класом.

Скажімо, у мене є простий вектор x <- c(4, 5, 6, 6)цілих чисел, це мало б сенс для цього бути цілочисельним класом. Але коли class(x)я отримую [1] "numeric". Тоді, якщо я перетворю цей вектор у цілочисельний клас x <- as.integer(x). Він повертає той самий точний список чисел, за винятком того, що клас відрізняється.

Моє питання полягає в тому, чому це так, і чому класом за замовчуванням для набору цілих чисел є числовий клас, і які переваги та недоліки має ціле число, встановлене як числове, а не ціле.


4
Чи as.integer(c(4.1, 5.2, 6.3, 6.4))допомагає вам зрозуміти різницю? Ви повинні розуміти, що внутрішнє подання та те, що друкується, зовсім не однакові. У будь-якому випадку, почитайте про типи даних комп'ютерними мовами.
Роланд

У стовпці "Пов’язані" справа - це запитання: stackoverflow.com/questions/8804779/…
Метью Лундберг

1
Спробуйте x <- 1; is.integer(x); is.numeric(x), тоді, x <- 1L; is.integer(x); is.numeric(x)і ви, можливо, зможете трохи побачити різницю. Цілі класи використовуються більше для передачі змінних із конструкцій C, а також у R-структурах. Хоча в цьому є набагато більше.
Rich Scriven

@Roland Я не думав про заняття із зазначенням точності. Я звик використовувати плаваючі методи для маніпулювання цілочисельними класами. Це має сенс.
Кеон

Відповіді:


87

Існує кілька класів, які згруповані разом як "числові" класи, 2 найпоширеніші з яких - подвійні (для подвійної точності чисел із плаваючою комою) та цілі числа. R автоматично перетворює між числовими класами, коли це потрібно, тому здебільшого для випадкового користувача не має значення, чи число 3 в даний час зберігається як ціле чи подвійне. Більшість математики виконується з подвійною точністю, тому це часто є типовим сховищем.

Іноді вам може знадобитися спеціально зберегти вектор як цілі числа, якщо ви знаєте, що вони ніколи не будуть перетворені в подвійні (використовуються як значення ідентифікатора або індексація), оскільки цілі числа потребують менше місця для зберігання. Але якщо вони будуть використовуватися в будь-якій математиці, яка перетворить їх на подвійні, то, мабуть, найшвидше буде просто зберегти їх як подвійні для початку.


47

По-перше, цілком можливо успішно використовувати R протягом багатьох років і не потрібно знати відповіді на це питання. R обробляє відмінності між (звичайними) числами та цілими числами у фоновому режимі.

> is.numeric(1)

[1] TRUE

> is.integer(1)

[1] FALSE

> is.numeric(1L)

[1] TRUE

> is.integer(1L)

[1] TRUE

(Поставлення великого «L» після цілого числа змушує його зберігатись як ціле число.)

Як бачите, "ціле число" - це підмножина "числового".

> .Machine$integer.max

[1] 2147483647

> .Machine$double.xmax

[1] 1.797693e+308

Цілі числа переходять лише на трохи більше 2 мільярдів, тоді як інші числа можуть бути набагато більшими. Вони можуть бути більшими, оскільки вони зберігаються як числа з плаваючою комою з подвійною точністю. Це означає, що число зберігається у двох частинах: показник ступеня (як 308 вище, за винятком основи 2, а не бази 10), і "значення" (як 1.797693 вище).

Зверніть увагу, що 'is.integer' - це не тест на те, чи є у вас ціле число, а тест на те, як дані зберігаються.

Одного, на що слід звернути увагу, - це те, що оператор двокрапки,, :поверне цілі числа, якщо початкові та кінцеві точки - цілі числа. Наприклад, 1:5створює integerвектор чисел від 1 до 5. Вам не потрібно додавати букву L.

> class(1:5)
[1] "integer"

Довідково: https://www.quora.com/What-is-the-difference-between-numeric-and-integer-in-R


11
Взято саме з допису Quora Правда? Ви могли просто згадати посилання!
Srujan Barai


4

Щоб процитувати сторінку довідки (спробуйте ?integer), напівжирним шрифтом:

Цілі цілі вектори існують для того, щоб дані могли передаватися коду C або Fortran, який їх очікує, і так далі (малі) цілочисельні дані могли бути представлені точно та компактно .

Зверніть увагу, що поточні реалізації R використовують 32-розрядні цілі числа для цілочисельних векторів, тому діапазон репрезентабельних цілих чисел обмежений приблизно +/- 2 * 10 ^ 9: подвійні можуть містити набагато більші цілі числа.

Як сказано на сторінці довідки, R integer мають підписані 32-розрядні номери, тому можуть містити від -2147483648 до +2147483647 і займати 4 байти.

R numericідентичні 64-розрядним, що doubleвідповідають стандарту IEEE 754. R не має єдиного типу даних точності. (джерело: довідкові сторінки numericта double). Double може зберігати всі цілі числа від -2 ^ 53 до 2 ^ 53 саме без втрати точності.

Ми можемо бачити розміри типів даних, включаючи накладні витрати на вектор ( джерело ):

> object.size(1:1000)
4040 bytes
> object.size(as.numeric(1:1000))
8040 bytes

1

Наскільки я розумію, ми не оголошуємо змінну з типом даних, тому за замовчуванням R встановив число без числа L як числове. Якщо ви писали:

> x <- c(4L, 5L, 6L, 6L)
> class(x)
>"integer" #it would be correct

Приклад цілого числа:

> x<- 2L
> print(x)

Приклад Numeric (подібний типу double / float з інших мов програмування)

> x<-3.4
> print(x)

стежте за діапазоном, як-от 1:5створить цілі числа.
qwr
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.