11

以前、テキスト ファイルから大きな素数を取り出して別のファイルに入れるという質問をしました。2^32 の後の最初の素数までのすべての素数を取得することになっていましたが、何らかの理由でこのスクリプトが機能しなくなりました。

#!/bin/bash
n=4294967296
last=0
while read number
    do
    if [ $last -gt $n ]
    then break
    fi
    echo $number
last=$number
done < primes.txt > primes2.txt

これらの 11 個の番号をループすることになりました。

4232004449  
4232004479  
4232004493  
4232004509  
4232004527  
4232004533  
4232004559  
4232004589  
4232004593  
4232004613  
004437

元のファイルには含まれていませんでした004437。私のbashは数字を処理します8999999999999999999

なぜこれが起こったのか、誰にも手がかりがありますか?

64 ビット Ubuntu 10.04、16 GB RAM、8 コア @ 3.60 GHz
GNU bash、バージョン 4.1.5(1)-リリース (x86_64-pc-linux-gnu)

アップデート:

jfgagne が提供する「修正された」bash をダウンロードしてコンパイルし、bash スクリプトでリンクすると、まったく同じ場所でエラーが発生しました。元の主要な質問に相当する非常に高速な perl を使用して、ls -al からいくつかのファイル サイズを取得しました。

        11  next_prime (just to make sure this was counting bytes accurately)
2147483659  primes2.txt
2147483670  one_too_many

2147483659 = 2^31 + 11

次の素数 ( 4232004631) のサイズは 11 バイトです。これは までのすべての素数を保持します4232004613004437また、このエラー ループの下部にある素数の終わりから が来ていることにも気付きました ( 4232004437)。何かが前進しようとしているようですが、行き詰まっています。

4

1 に答える 1

7

いいえ、OS のビットサイズとは無関係です。これは、bash ソースの奥深くにある単純な宣言に依存しています。

この宣言は 2002 年頃から __int64_t です。それ以来、bash バージョン >= 3.00 は常に 64 ビット整数変数を使用し、アーキテクチャに依存しません! bash のバージョンのみに依存します。

以前のバージョンの bash は、64 ビット OS でも常に 32 ビット整数を使用していました。

于 2013-11-25T11:55:44.427 に答える