Целые числа в R-программировании [дубликат]

:

mvn install:install-file -Dfile=c:\kaptcha-{version}.jar -DgroupId=com.google.code
-DartifactId=kaptcha -Dversion={version} -Dpackaging=jar
26
задан Simon O'Hanlon 22 June 2014 в 12:21
поделиться

1 ответ

Почему «L» используется как суффикс?

Я никогда не видел его записанным, но я кратко объясняю по двум причинам:

  1. Поскольку R обрабатывает комплексные числа, которые могут быть указаны с использованием суффикса "i", и это было бы слишком похоже на "I"
  2. . Поскольку целые числа R представляют собой 32-битные длинные целые числа, а «L», следовательно, представляется разумным сокращением для ссылаясь на этот тип данных.

Значение, которое может принимать длинное целое, зависит от размера слова. R не поддерживает целые числа со словом длиной 64 бит. Целые числа в R имеют длину слова 32 бита и подписаны и, следовательно, имеют диапазон от −2,147,483,648 до 2,147,483,647. Большие значения сохраняются как double.

Эта страница wiki содержит дополнительную информацию об общих типах данных, их условных именах и диапазонах.

А также из ?integer

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


Почему 1.0L и 1.1L возвращают разные типы?

Причина, по которой 1.0L и 1.1L возвращает разные типы данных, заключается в том, что возвращение целое число для 1.1 приведет к потере информации, в то время как для 1.0 он не будет (но вы, возможно, захотите узнать, что у вас больше нет числа с плавающей запятой). Погруженный глубоко с помощью лексического анализатора (/src/main/gram.c:4463-4485) является этим кодом (частью функции NumericValue()), который фактически создает тип данных int из входа double, который суффикс ascii "L":

/* Make certain that things are okay. */
if(c == 'L') {
double a = R_atof(yytext);
int b = (int) a;
/* We are asked to create an integer via the L, so we check that the
   double and int values are the same. If not, this is a problem and we
   will not lose information and so use the numeric value.
*/
if(a != (double) b) {
    if(GenerateCode) {
    if(seendot == 1 && seenexp == 0)
        warning(_("integer literal %s contains decimal; using numeric value"), yytext);
    else {
        /* hide the L for the warning message */
        *(yyp-2) = '\0';
        warning(_("non-integer value %s qualified with L; using numeric value"), yytext);
        *(yyp-2) = (char)c;
    }
    }
    asNumeric = 1;
    seenexp = 1;
}
}
26
ответ дан Scarabee 27 August 2018 в 10:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: