我之前问过一个问题,涉及从文本文件中提取大质数并将它们放入另一个文件中.它应该在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
Run Code Online (Sandbox Code Playgroud)
最终循环遍历这11个数字:
4232004449
4232004479
4232004493
4232004509
4232004527
4232004533
4232004559
4232004589
4232004593
4232004613
004437
Run Code Online (Sandbox Code Playgroud)
原始文件没有004437,我的bash将处理数字8999999999999999999
有没有人知道为什么会这样?
64位Ubuntu 10.04,16GB内存,8核@ 3.60 GHz
GNU bash,版本4.1.5(1)-release(x86_64-pc-linux-gnu)
更新:
下载并编译jfgagne提供的"fixed"bash并在我的bash脚本中链接到它后,它在同一个位置出错了.使用来自我原始主要问题的明显更快的perl等价物,我从ls -al获得了一些文件大小:
11 next_prime (just to make sure this was counting bytes accurately)
2147483659 primes2.txt
2147483670 one_too_many
Run Code Online (Sandbox Code Playgroud)
2147483659 = 2 ^ 31 + 11
下一个prime(4232004631)的大小是11个字节.它保存所有素数4232004613.我也意识到这004437是来自这个错误循环底部的素数结束(4232004437).看起来有些东西正试图推进,但卡住了.
不,它独立于您的操作系统的比特.它取决于bash源中的一个简单声明.
从2002年左右开始,这个声明是__int64_t.从那时起,bash版本> = 3.00总是使用64位整数变量,它不依赖于体系结构!它只取决于bash版本.
以前版本的bash总是使用32位整数,即使在64位操作系统上也是如此.
| 归档时间: |
|
| 查看次数: |
3035 次 |
| 最近记录: |