web-dev-qa-db-ja.com

Rの整数オーバーフローとは何ですか?

私はいくつかの計算が進行していて、次の警告が表示されます(つまり、エラーではありません):

Warning messages:
1: In sum(myvar, na.rm = T) :
Integer overflow - use sum(as.numeric(.))

これで thread 人々は、整数オーバーフローは決して起こらないと述べています。 Rが過度にモダンではないか、正しくありません。しかし、私はここで何をするべきですか?警告が示唆するようにas.numericを使用すると、以前は情報が失われているという事実を説明できないかもしれません。 myvarは.csvファイルから読み取られるので、Rはもっと大きなフィールドが必要であることを理解すべきではありませんか?すでに何かを切断していますか?

integerまたはnumericの最大長は?他のフィールドタイプ/モードを提案しますか?

編集:私は実行します:

Rバージョン2.13.2(2011-09-30)プラットフォーム:R Studio内のx86_64-Apple-darwin9.8.0/x86_64(64ビット)

33
Matt Bannert

ヘルプページ?integerを読むことで、多くの質問に答えることができます。それは言います:

Rは整数ベクトルに32ビット整数を使用するため、表現可能な整数の範囲は約+/- 2 * 10 ^ 9に制限されます。

R Coreはより大きな整数への拡張を検討していますが、近い将来には発生しません。

「bignum」の容量が必要な場合は、Martin MaechlerのRmpfrパッケージ[PDF]をインストールしてください。著者の評判から、「Rmpfr」パッケージをお勧めします。 Martin Maechlerは、Matrixパッケージ開発にも深く関与しており、R Coreも同様です。 「gmp」、「Brobdingnag」、「Ryacas」パッケージなどの算術パッケージを含む代替手段があります(後者はまた、シンボリック数学インターフェースを提供します)。

次に、リンクした回答の重要なコメントに回答し、作業との関連性を評価する方法を検討してください。これらの「現代」言語のいずれかでRと同じ統計機能を使用できる場合、その方向にユーザーが移行する可能性があります。しかし、現時点では、移行と確かに成長はR方向にあると言えます。 Rは、統計のために統計学者によって作成されました。

かつて統計パッケージXlisp-Statを備えたLISPバリアントがありましたが、その主な開発者および支持者は現在R-Coreのメンバーです。一方、最も初期のR開発者の1人であるRoss Ihakaは、LISPのような言語での開発に向けての提案[ PDF]。実験インターフェースのRincanterを備えたClojureと呼ばれるコンパイルされた言語(英語を話す人が「クロージャ」と言うように発音される)があります。

更新:

Rの新しいバージョン(3.0。+)には、53ビットの整数があります(numeric仮数を使用)。 「整数」ベクトル要素に「.Machine $ integer.max」を超える値が割り当てられると、ベクトル全体が「数値」、別名「二重」に強制変換されます。 integersの最大値はそのままですが、以前オーバーフローを生成していた場合の精度を維持するために、整数ベクトルの倍への強制があります。残念ながら、リスト、行列と配列の次元、およびベクトルの長さはinteger.maxに設定されたままです。

ファイルから大きな値を読み込む場合は、おそらくターゲットとして文字クラスを使用してから操作する方が安全です。 NA値に強制がある場合、警告が表示されます。

39
42-

つまり、integerは範囲が限定された正確な型であり、numericは浮動小数点型であり、はるかに広い範囲の値を表すことができますが、不正確です。詳細については、ヘルプページ(_?integer_および_?numeric_)を参照してください。

オーバーフローについては、Brian D. Ripleyによる 説明 があります。

これは、いくつかの非常に大きな整数の平均(あなたの場合、合計-@aix)を取っていることを意味し、計算がオーバーフローしています。これは単なる警告です。

これは、Rの次のリリースでは発生しません。

数値が整数であることを指定するには、接尾辞Lを指定します。たとえば、_1L_は、浮動小数点である_1_ではなく、整数の1です。クラス_"numeric"_。

マシンで作成できる最大の整数は、_.Machine$integer.max_で指定されます。

_> .Machine$integer.max
[1] 2147483647
> class(.Machine$integer.max)
[1] "integer"
_

これに正の整数を追加するとオーバーフローが発生し、NAが返されます。

_> .Machine$integer.max + 1L
[1] NA
Warning message:
In .Machine$integer.max + 1L : NAs produced by integer overflow
> class(.Machine$integer.max + 1L)
[1] "integer"
_

代わりに浮動小数点値を追加することにより、この制限を回避できます。

_> .Machine$integer.max + 1
[1] 2147483648
> class(.Machine$integer.max + 1)
[1] "numeric"
_

あなたの場合、警告はsumによって発行されるため、これは数字が加算されるときにオーバーフローが発生することを示しています。推奨される回避策sum(as.numeric(.))がトリックを行うはずです。

21
NPE

整数または数値の最大長は?

ベクターは現在整数でインデックス付けされているため、最大長は.Machine$integer.max。 DWinが指摘したように、Rのすべてのバージョンは現在32ビット整数を使用しているため、これは2^31 - 1、または20億強。

いくつかの深刻なハードウェアを梱包している場合(または、これを将来読んでいる場合、2012年からこんにちは)を除き、その長さのベクトルを割り当てるのに十分なメモリがありません。

Rコア(ブライアンリプリー、私が思う)が次のステップは、倍数の仮数またはそのような巧妙なものでベクトルにインデックスを付けることであり、事実上48ビットのインデックスを与えることを示唆した議論を覚えています。悲しいことに、私はその議論を見つけることができません。


Rmpfrパッケージに加えて、整数オーバーフローが発生している場合は、int64 パッケージ。

4
Richie Cotton