6

私自身の娯楽のために、 Hailstoneシーケンスを計算するためのバッチファイルを書いてみることにしました。しかし、私はいくつかの大きな数字で小さな問題に遭遇しました。

まず、コード:

: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

ここに画像の説明を入力してください

グーグルによると、次の数字はであるはず2176782334です。

これは、コマンドプロセッサが多数を処理する能力の自然な制限ですか?同様の操作はExcelでも正常に実行されます。そこで、473回の反復で1に解決されるべきであると判断できました。

Windows 7SP1x64を実行しています。

4

2 に答える 2

6

2176782334は、32ビット整数が保持できるよりも大きいです。(2 ^ 31-1 = 2,147,483,647)。あなたが経験しているのは整数のオーバーフローです(負の値を引き起こします)。

最近のほとんどの言語には、long-2^64から2^64-1の範囲の整数を保持できるデータ型があります。Javaのように、無限精度の整数を許可するデータ型もありますBigInteger

于 2012-07-18T16:30:18.853 に答える
2

バッチファイルで可能な最大の整数は、2,147,483,647(32ビットの符号付き整数の最大値)である可能性があります。

于 2012-07-18T16:29:15.577 に答える