В чем разница между «1L» и «1»?

Я часто видел, что символ 1L (или 2L , 3L и т. Д.) Появляется в R-коде. В чем разница между 1L и 1 ? 1==1L оценивает значение TRUE . Почему 1L используется в R-коде?

Итак, @James и @Brian объяснили, что означает 3L. Но зачем вы его используете?

В большинстве случаев это не имеет значения, но иногда вы можете использовать его, чтобы ваш код работал быстрее и потреблял меньше памяти . Двойной («числовой») вектор использует 8 байтов на элемент. Целочисленный вектор использует только 4 байта на элемент. Для больших векторов это меньше потраченная впустую память и меньше, чтобы провалиться для CPU (так это, как правило, быстрее).

В основном это относится к работе с индексами. Вот пример, когда добавление 1 к целочисленному вектору превращает его в двойной вектор:

 x <- 1:100 typeof(x) # integer y <- x+1 typeof(y) # double, twice the memory size object.size(y) # 840 bytes (on win64) z <- x+1L typeof(z) # still integer object.size(z) # 440 bytes (on win64) 

... но также отметим, что чрезмерная работа с целыми числами может быть опасной:

 1e9L * 2L # Works fine; fast lean and mean! 1e9L * 4L # Ooops, overflow! 

... и, как отметил Гавин, диапазон для целых чисел примерно от -2e9 до 2e9.

Однако следует отметить, что это относится к текущей версии R (2.13). R может изменить это в какой-то момент (64-битные целые числа будут милыми, что может позволить векторы длиной> 2e9). Чтобы быть в безопасности, вы должны использовать .Machine$integer.max всякий раз, когда вам нужно максимальное целочисленное значение (и отрицать это для минимума).

Из раздела констант языка R Определение :

Мы можем использовать суффикс «L», чтобы квалифицировать любое число с целью сделать его явным целым числом. Таким образом, «0x10L» создает целочисленное значение 16 из шестнадцатеричного представления. Константа 1e3L дает 1000 как целое число, а не числовое значение и эквивалентно 1000L. (Обратите внимание, что «L» рассматривается как квалифицирующий термин 1e3, а не 3.) Если мы квалифицируем значение с «L», которое не является целочисленным значением, например 1e-3L, мы получаем предупреждение, а числовое значение создано. Предупреждение также создается, если в номере есть ненужная десятичная точка, например 1.L.

L указывает целочисленный тип, а не двойной, чем стандартный числовой class.

 > str(1) num 1 > str(1L) int 1 

Чтобы явно создать целочисленное значение для константы, вы можете вызвать функцию as.integer или просто использовать суффикс L.

  • Почему Java-коллекции не могут напрямую хранить типы примитивов?
  • c ++ конвертировать из LPCTSTR в const char *
  • Настроить десятичную точку вместо запятой в вводе номера HTML5 (на стороне клиента)
  • В чем разница между кастингом и конверсией?
  • long / bigint / десятичный эквивалентный тип данных в R
  • Как установить значение составного поля переменных с помощью динамического SQL
  • Interesting Posts

    У node.js эквивалент объекта window в браузере

    Disambiguate перегруженный указатель функции участника передается как параметр шаблона

    Java: перемещение изображения в положение мыши

    Что такое ошибка «Неверная инструкция: 4» и почему «-mmacosx-version-min = 10.x» исправить?

    Как получить вертикальное разделение терминала на Mac для выполнения различных действий?

    Как получить дополнительную информацию о высокопроизводительном процессе rundll32.exe?

    Обновите только одну версию XP до Windows 8 на компьютере с двойной загрузкой

    System.console () возвращает значение null

    Значение Autonumber последней вставленной строки – MS Access / VBA

    Как я могу избежать проверки хоста SSH для известных хостов?

    Как отслеживать посещаемые веб-сайты?

    Гарантируется ли сборщик мусора перед ошибкой вне памяти?

    Прекратить работу node.js

    Создайте изображение или распечатайте веб-страницу, большую, чем экран из веб-браузера.

    Устройство, \ Device \ Harddisk1 \ D, имеет плохой блок

    Давайте будем гением компьютера.