为啥 R 会使用“L”后缀来表示整数?

Posted

技术标签:

【中文标题】为啥 R 会使用“L”后缀来表示整数?【英文标题】:Why would R use the "L" suffix to denote an integer?为什么 R 会使用“L”后缀来表示整数? 【发布时间】:2014-08-12 14:19:06 【问题描述】:

在 R 中,我们都知道在我们想要确保处理一个整数时使用 "L" 后缀来指定它是很方便的,如下所示:

1L
# [1] 1

如果我们没有明确告诉 R 我们想要一个整数,它将假定我们打算使用 numeric 数据类型...

str( 1 * 1 )
# num 1
str( 1L * 1L )
# int 1

为什么“L”是首选后缀,为什么不是“I”?有历史原因吗?

另外,为什么 R 允许我这样做(带有警告):

str(1.0L)
# int 1
# Warning message:
# integer literal 1.0L contains unnecessary decimal point 

但不是..

str(1.1L)
# num 1.1
#Warning message:
#integer literal 1.1L contains decimal; using numeric value 

我希望两者都返回错误。

【问题讨论】:

对于您问题的第一部分(“为什么将“L”用作后缀”):在this answer 我指的是a thread,威廉·邓洛普和布赖恩·里普利讨论了“一种可能的解释”为什么要写信L"。 @Henrik 感谢(两个)链接。您的回答也很好,内容丰富。 【参考方案1】:

为什么用“L”作为后缀?

我从未见过它被写下来,但我总结起来有两个原因:

    因为 R 处理的复数可以使用 后缀"i""I" 太相似了

    因为 R 的整数是 32 位长整数,因此“L”似乎是指代这种数据类型的合理简写。

长整数可以取的值取决于字的大小。 R 本身不支持字长为 64 位的整数。 R 中的整数的字长为 32 位,并且是有符号的,因此范围为 −2,147,483,6482,147,483,647。较大的值存储为double

This wiki page 提供有关常见数据类型、它们的常规名称和范围的更多信息。

还有来自?integer

请注意,R 的当前实现使用 32 位整数作为整数向量,因此可表示整数的范围被限制在大约 +/-2*10^9 左右:双精度可以精确地容纳更大的整数。


为什么 1.0L 和 1.1L 返回的类型不同?

1.0L1.1L 将返回不同数据类型的原因是因为为 1.1 返回一个整数会导致信息丢失,而对于 1.0 则不会(但您可能想了解您不再有浮点数)。与词法分析器 (/src/main/gram.c:4463-4485) 一起深埋的是这段代码(函数 NumericValue() 的一部分),它实际上从 double 输入创建了一个 int 数据类型,该输入以 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;


【讨论】:

relevant section of the r language definition 似乎没有说什么更有启发性 我认为在新版本的R中支持64位整数大小。 @user1436187 我不这么认为。我引用了R 3.1.0。如答案中所述,这些将是 double 类型。参见例如here。整数使用 32 位长的 C int 类型。整数现在也可以使用 double 数据类型的双精度向量来表示。

以上是关于为啥 R 会使用“L”后缀来表示整数?的主要内容,如果未能解决你的问题,请参考以下文章

4.常量

小程序 - c字符串表示大整数

C语言程序设计数据的表现形式以及运算

基础算法--差分

楼房(洛谷 1382)

C++:常量