2012-07-18 124 views
3

爲了我自己的娛樂,我決定嘗試編寫一個批處理文件來計算Hailstone Sequences。但是,我遇到了一些大數字的小問題。批處理文件不能處理大量數據嗎?

首先,代碼:

:START 
@ECHO OFF 
SETLOCAL 
SET /P InputVar="Input Number: " 
ECHO. 
ECHO %InputVar% 
SET ItCount=0 

:COLLATZ 
SET /A ItCount=%ItCount%+1 
SET /A Odd=%InputVar%%%2 
IF %Odd% EQU 1 (
    SET /A OutputNum=%InputVar%*3+1 
) ELSE (
    SET /A OutputNum=%InputVar%/2 
) 
ECHO %OutputNum% 
IF %OutputNum% LSS 1 (
    GOTO ERROR 
) ELSE (
    GOTO RECYCLE 
) 

:ERROR 
ECHO. 
ECHO ERROR! 
GOTO END 

:RECYCLE 
IF %OutputNum% EQU 1 (
    GOTO FINISH 
) ELSE ( 
    SET InputVar=%OutputNum% 
    GOTO COLLATZ 
) 

:FINISH 
ECHO. 
ECHO Completed in %ItCount% iterations. 

:END 
ENDLOCAL 
PAUSE 

這適用於幾個數字我測試過。但是,當我開始測試一個新的數字需要數百次迭代才能完成時,系統開始返回負數輸出。有趣的是,負面結果最終解決爲零。但是,腳本的這種行爲完全沒有預期或意圖。

添加錯誤處理後,這是我得到的輸出爲8388607

enter image description here

Google,未來數應該已經2176782334

這是命令處理器處理大量數據的能力的自然限制嗎?類似的操作在Excel中運行良好 - 在那裏,我能夠確定數字應該在473次迭代中解決爲1。

我正在運行Windows 7 SP1 x64。

回答

3

2176782334大於一個32位整數可以容納。 (2^31-1 = 2,147,483,647)。你遇到的是整數溢出(導致負值)。

大多數現代語言的數據類型爲long,這將允許您保存範圍在-2^64到2^64 -1之間的整數。甚至有數據類型允許無限精度整數,如Java的BigInteger

+0

爲什麼我限制在64位系統上的32位? CMD.exe仍然是一個32位應用程序? – Iszi 2012-07-18 16:35:33

+0

我不認爲它支持長數據類型,可能是因爲它不是爲這樣的程序構建的。它與操作系統沒有任何關係。是否有一個原因,你不想用另一種語言做到這一點? – 2012-07-18 16:37:04

+0

很多隻是因爲我不知道任何真正的語言。學習其中一個或兩個仍在我的待辦事項清單上。 – Iszi 2012-07-18 16:44:30

1

批處理文件中最大可能的整數很可能是2,147,483,647(32位有符號整數的最大值)。

+1

刪除單詞「最有可能」,你有正確的答案:-) – dbenham 2012-07-18 16:40:13

+0

我找不到備份我的斷言的參考。 – 2012-07-18 16:41:21