重击次数限制



我之前问了一个问题,涉及从一个文本文件中提取大素数并将其放入另一个文件中。它应该抓取所有素数,直到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,16GB 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字节这将所有素数保持到4232004613。我还意识到004437来自这个错误循环(4232004437)底部素数的末尾。似乎有什么东西在试图前进,但却停滞不前。

否,它与操作系统的位大小无关。它依赖于bash源代码中的一个简单声明。

自2002年左右以来,此声明为__int64_t。从那时起,bash版本>=3.00总是使用64位整数变量,而且它不依赖于体系结构!它只取决于bash版本。

bash的早期版本总是使用32位整数,即使在64位操作系统上也是如此。

相关内容

  • 没有找到相关文章

最新更新