web-dev-qa-db-ja.com

「1L」と「1」の違いは何ですか?

Rコードにシンボル1L(または2L3Lなど)が表示されることがよくありました。 1L1の違いは何ですか? 1==1LTRUEと評価されます。 Rコードで1Lが使用されるのはなぜですか?

139
Zach

したがって、@ Jamesと@Brianはwhat 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!

...そして@Gavinが指摘したように、整数の範囲はおおよそ-2e9から2e9です。

ただし、これは現在のRバージョン(2.13)に適用されることに注意してください。 Rは、ある時点でこれを変更する場合があります(64ビット整数は、長さが2e9を超えるベクトルを有効にする可能性があります)。安全のために、最大整数値が必要なときはいつでも.Machine$integer.maxを使用する必要があります(最小値は無効にします)。

117
Tommy

定数セクション から R言語定義

接尾辞「L」を使用して、明示的な整数にする目的で任意の数値を修飾できます。したがって、「0x10L」は16進表現から整数値16を作成します。定数1e3Lは、数値ではなく整数として1000を与え、1000Lと同等です。 (「L」は3ではなく1e3という用語を修飾するものとして扱われます。)整数値ではない「L」で値を修飾する場合、 1e-3L、警告が表示され、数値が作成されます。数字に不要な小数点がある場合、警告も作成されます。 1.L.

54
Brian Gordon

Lは、標準の数値クラスのdoubleではなく、整数型を指定します。

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

定数の整数値を明示的に作成するには、as.integer関数を呼び出すか、単にサフィックス「L」を使用します。

1
Eddy Zavala