Update:

バッチ処理サンプル(その3)「浮動小数計算」

Windowsの標準コマンドで作成したプログラム(?)達です。

Windows 2000、XPで使えるようになった拡張機能を利用しています。
たいした処理はしていませんが、何かの参考や役に立てば幸いです。
※Windows 9x/meでは利用できません。ご了承ください。

数値計算2

簡易な浮動小数点での四則計算です。
コマンドプロンプトでは、SETコマンドで数値計算ができるようになっています。
2進数32ビットの整数計算しかサポートしていないので、有効桁数8桁の浮動小数点計算をさせて見ます。
ここでは、有効桁数を10進数8桁とし、指数部を-8〜8までで指定できるものとします。
整数部で0〜±99999999、小数部で0.00000001〜0.99999999の範囲をカバーしますが、実際には、整数部と小数部を合わせて8桁までしか扱えないということです。
浮動小数点の表現形式は、(±p±xxxxxxxx)としています。
±p:10進数の小数点の位置を表します。(+2なら小数点位置を右に2桁移動します。)
±xxxxxxxx:10進数8桁の数字です。(±0.xxxxxxxxを表すことにしています。)
計算結果が、オーバーフローしたときは、指数部を「+9」に設定し、結果の表示は「±999999999」としています。
また、アンダーフロー(指数部が「−9」以下)となったときは、結果の表示を「0」とします。
変な仕様ですが簡易な小数点付き計算ということでお願いします。
サブルーチンの使い方は、単純に10進数で「 adddp.bat 数値a 数値b 」のようにすれば、普通に10進数で計算結果を表示します。
もし必要があれば、環境変数floatに浮動小数点形式の計算結果を格納しているのでご覧ください。

ページトップへ戻る

足し算(加算)

このサブルーチンでは、負数の計算もサポートしています。

@title 加算(浮動小数点)
@echo off
set a=%~1
if "%a%" == "" set /p a=数値aを入力してください:
set b=%~2
if "%b%" == "" set /p b=数値bを入力してください:
if "%a%" == "" goto help
if "%b%" == "" set b=0

call :adddp %a% %b%
echo %adddp%

exit /b

REM ===============================================
rem 初期化(spc:ダミーの空白(スペース), zero:ダミーの0,
rem         ec:小数点の位置, sc:実数部の符号)
:adddp
set spc=(8桁の半角スペース)
set zero=00000000
set ec=0
set sc=+
call :get_dp %~1
set ea=%get_dp:~0,2%
set sa=%get_dp:~2,1%
set ra=%get_dp:~3%
call :get_dp %~2
set eb=%get_dp:~0,2%
set sb=%get_dp:~2,1%
set rb=%get_dp:~3%
rem 数値の桁を揃えて足し算を行ないます。
set /a ec=%ea% - %eb%
if %ec% GTR 0 set eb=%ea%&call set rb=%%spc:~0,%ec%%%%rb%
set rb=%rb:~0,8%
if %ec% LSS 0 set ea=%eb%&call set ra=%%spc:~%ec%%%%ra%
set ra=%ra:~0,8%
set /a rc=(%sa%%ra%+0)+(%sb%%rb%+0)
set /a ec=%ea%
rem 桁上がり、桁下がりのチェック
set /a abs_rc=%rc%
if %rc% LSS 0 set /a abs_rc=-%rc%
if %abs_rc% GEQ 100000000 set /a ec+=1
if %abs_rc% LSS 10000000 set /a ec-=1
if %abs_rc% LSS 1000000 set /a ec-=1
if %abs_rc% LSS 100000 set /a ec-=1
if %abs_rc% LSS 10000 set /a ec-=1
if %abs_rc% LSS 1000 set /a ec-=1
if %abs_rc% LSS 100 set /a ec-=1
if %abs_rc% LSS 10 set /a ec-=1
if %ec% GEQ 0 set ec=+%ec%
rem 実数部の数値を整えます。
set rc=%rc%%zero%
if %rc% GEQ 0 set rc=%rc:~0,8%&set sc=+
if %rc% LSS 0 set rc=%rc:~1,8%&set sc=-
rem 計算結果が大きくなりすぎ(オーバーフロー)たり、小さく
rem      なりすぎ(アンダーフロー)た場合の対処
if %ec% GTR 8 set ec=+9&set rc=99999999
if %ec% LSS -8 set ec=-9&set rc=00000000
if %rc% EQU 0 set ec=-9&set rc=00000000
set float=%ec%%sc%%rc%
rem 浮動小数点形式から固定小数点(通常の表示方法)形式に変換します。
if %ec% GTR 0 call set int=%%rc:~0,%ec%%%.&call set flc=%%rc:~%ec%%%
if %ec% LSS 0 call set int=0.%%zero:~0,%ec%%%&set flc=%rc%
if %ec% EQU 0 set int=0.&set flc=%rc%
if %ec% GTR 8 call set int=999999999&call set flc=
set adddp=%sc%%int%%flc%
rem 数値の形式を整えます。
:adddp_zs
if %adddp:~-1% EQU 0 set adddp=%adddp:~0,-1%&goto adddp_zs
if "%adddp:~-1%" == "." set adddp=%adddp:~0,-1%
if "%adddp:~0,1%" == "+" set adddp=%adddp:~1%
if "%adddp%" == "-0" set adddp=0
rem echo a:%ea% %ra% b:%eb% %rb%
goto :EOF

REM ===============================================
rem 与えられた数値を浮動小数点形式に変換します。
:get_dp
rem 初期化(string:数字文字列, number:浮動小数点への変換作業,
rem nsw:数字の桁数, dp:小数点位置, pos:文字列中の位置, sign:数値の符号)
set string=%~1
set number=
set nsw=0
set dp=0
set pos=0
set sign=
:get_dp_while01
rem 文字列からchに1文字取り出して、数字と比較します。
call set ch=%%string:~%pos%,1%%
rem call echo set ch=%%string:~%pos%,1%%
if "%ch%" == "" goto get_dp_wend01
if "%ch%" == "0" goto get_dp_next01
if "%ch%" == "1" goto get_dp_next01
if "%ch%" == "2" goto get_dp_next01
if "%ch%" == "3" goto get_dp_next01
if "%ch%" == "4" goto get_dp_next01
if "%ch%" == "5" goto get_dp_next01
if "%ch%" == "6" goto get_dp_next01
if "%ch%" == "7" goto get_dp_next01
if "%ch%" == "8" goto get_dp_next01
if "%ch%" == "9" goto get_dp_next01
if "%ch%" == "." goto get_dp_dp01
if "%ch%" == "-" goto get_dp_minus
if %nsw% EQU 0 set /a pos+=1&goto get_dp_while01
goto get_dp_wend01
:get_dp_minus
set /a pos+=1
rem 数字の間にある場合は、マイナス符号で無いので次の文字へ
if %nsw% GTR 0 goto get_dp_while01
call set ch=%%string:~%pos%,1%%
rem 次の文字が数字であればマイナス符号となります。
if %ch% GTR 0 set sign=-
if "%ch%" == "0" set sign=-
goto get_dp_while01
:get_dp_dp01
rem 数字と数字の間になければ小数点では無いので次の文字へ
if %nsw% EQU 0 set /a pos+=1&goto get_dp_while01
rem 小数点の場合、位置を記憶して次の文字へ
set dp=%nsw%
set /a pos+=1
goto get_dp_while01
:get_dp_next01
rem 数字を保存して次の文字へ
set /a nsw+=1
set /a pos+=1
set number=%number%%ch%
goto get_dp_while01
:get_dp_wend01
if %dp% EQU 0 set dp=%nsw%
rem 数値の頭にある0を削除します。
set number=%number%00000000.
:get_dp_zs
if %number:~0,1% EQU 0 set number=%number:~1%&set /a dp-=1&goto get_dp_zs
if "%number%" == "." set number=00000000
if %dp% GEQ 0 set dp=+%dp%
if "%sign%" =="-" (set number=-%number%) else (set number=+%number%)
rem 浮動小数点形式を整えます。
set number=%dp%%number%00000000
set number=%number:~0,11%
set get_dp=%number%
goto :EOF

:help
ECHO %0:浮動小数点計算
ECHO このバッチは、有効桁数 8桁、10の8乗(10^8)〜10の-8乗(10^-8)までの範囲
ECHO で、四則計算(加算)を行うプログラムです。
ECHO 浮動小数点の形式は、±p±xxxxxxxx(p:10のべき乗、0.xxxxxxxx:10進数8桁)
ECHO という表現をとっています。
ECHO (使い方)
ECHO %0 数値a 数値b
ECHO  数値a:-9999999〜99999999の範囲の数値
ECHO  数値b:-9999999〜99999999の範囲の数値
ECHO  小数は0.00000001〜0.99999999までを扱えます。
ECHO  ただし、整数部と小数部をあわせて8桁を超える部分は、切り捨てられます。
ECHO  また、小数は必ず0.123のように整数部を持たなければなりません。
ECHO  .123のような小数点から始まる数は、123と解釈します。
ECHO 与えた数値を元に加算を行ない、その結果を表示します。
ECHO 【実行例】
ECHO %0 123.456 -11.0101
ECHO 112.4459
ECHO.
ECHO 引数を与えなかった場合は、数値aと数値bの入力を求めます。
ECHO 数値a、を入力しなかった場合は、簡単な説明(この画面)を表示します。
ECHO 数値b、を入力しなかった場合は、b=0 として計算を実行します。
ECHO.
pause
exit /b

ページトップへ戻る

引き算(減算)

引き算(減算)も負数を扱うと足し算(加算)とほぼ同じプログラムになります。(足し算の記述と見比べてください。)
@title 減算(浮動小数計算)
@echo off
set a=%~1
if "%a%" == "" set /p a=数値aを入力してください:
set b=%~2
if "%b%" == "" set /p b=数値bを入力してください:
if "%a%" == "" goto help
if "%b%" == "" set b=0

call :subdp %a% %b%
echo %subdp%

exit /b

REM ===============================================
:subdp
rem 初期化(spc:ダミーの空白(スペース), zero:ダミーの0,
rem       ec:小数点の位置, sc:実数部の符号)
set spc=(8桁の半角スペース)
set zero=00000000
set ec=0
set sc=+
call :get_dp %~1
set ea=%get_dp:~0,2%
set sa=%get_dp:~2,1%
set ra=%get_dp:~3%
call :get_dp %~2
set eb=%get_dp:~0,2%
set sb=%get_dp:~2,1%
set rb=%get_dp:~3%
rem 数値の桁を揃えて引き算を行ないます。
set /a ec=%ea% - %eb%
if %ec% GTR 0 set eb=%ea%&call set rb=%%spc:~0,%ec%%%%rb%
set rb=%rb:~0,8%
if %ec% LSS 0 set ea=%eb%&call set ra=%%spc:~%ec%%%%ra%
set ra=%ra:~0,8%
set /a rc=(%sa%%ra%+0)-(%sb%%rb%+0)
set /a ec=%ea%
rem 桁上がり、桁下がりのチェック
set /a abs_rc=%rc%
if %rc% LSS 0 set /a abs_rc=-%rc%
if %abs_rc% GEQ 100000000 set /a ec+=1
if %abs_rc% LSS 10000000 set /a ec-=1
if %abs_rc% LSS 1000000 set /a ec-=1
if %abs_rc% LSS 100000 set /a ec-=1
if %abs_rc% LSS 10000 set /a ec-=1
if %abs_rc% LSS 1000 set /a ec-=1
if %abs_rc% LSS 100 set /a ec-=1
if %abs_rc% LSS 10 set /a ec-=1
if %ec% GEQ 0 set ec=+%ec%
rem 実数部の数値を整えます。
set rc=%rc%%zero%
if %rc% GEQ 0 set rc=%rc:~0,8%&set sc=+
if %rc% LSS 0 set rc=%rc:~1,8%&set sc=-
rem 計算結果が大きくなりすぎ(オーバーフロー)たり、小さく
rem     なりすぎ(アンダーフロー)た場合の対処
if %ec% GTR 8 set ec=+9&set rc=99999999
if %ec% LSS -8 set ec=-9&set rc=00000000
if %rc% EQU 0 set ec=-9&set rc=00000000
set float=%ec%%sc%%rc%
rem 浮動小数点形式から固定小数点(通常の表示方法)形式に変換します。
if %ec% GTR 0 call set int=%%rc:~0,%ec%%%.&call set flc=%%rc:~%ec%%%
if %ec% LSS 0 call set int=0.%%zero:~0,%ec%%%&set flc=%rc%
if %ec% EQU 0 set int=0.&set flc=%rc%
if %ec% GTR 8 call set int=999999999&call set flc=
set subdp=%sc%%int%%flc%
rem 数値の形式を整えます。
:subdp_zs
if %subdp:~-1% EQU 0 set subdp=%subdp:~0,-1%&goto subdp_zs
if "%subdp:~-1%" == "." set subdp=%subdp:~0,-1%
if "%subdp:~0,1%" == "+" set subdp=%subdp:~1%
if "%subdp%" == "-0" set subdp=0
rem echo a:%ea% %ra% b:%eb% %rb%
goto :EOF

REM ===============================================
rem 与えられた数値を浮動小数点形式に変換します。
:get_dp
rem 初期化(string:数字文字列, number:浮動小数点への変換作業,
rem   nsw:数字の桁数, dp:小数点位置, pos:文字列中の位置, sign:数値の符号)
set string=%~1
set number=
set nsw=0
set dp=0
set pos=0
set sign=
:get_dp_while01
rem 文字列からchに1文字取り出して、数字と比較します。
call set ch=%%string:~%pos%,1%%
rem call echo set ch=%%string:~%pos%,1%%
if "%ch%" == "" goto get_dp_wend01
if "%ch%" == "0" goto get_dp_next01
if "%ch%" == "1" goto get_dp_next01
if "%ch%" == "2" goto get_dp_next01
if "%ch%" == "3" goto get_dp_next01
if "%ch%" == "4" goto get_dp_next01
if "%ch%" == "5" goto get_dp_next01
if "%ch%" == "6" goto get_dp_next01
if "%ch%" == "7" goto get_dp_next01
if "%ch%" == "8" goto get_dp_next01
if "%ch%" == "9" goto get_dp_next01
if "%ch%" == "." goto get_dp_dp01
if "%ch%" == "-" goto get_dp_minus
if %nsw% EQU 0 set /a pos+=1&goto get_dp_while01
goto get_dp_wend01
:get_dp_minus
set /a pos+=1
rem 数字の間にある場合は、マイナス符号で無いので次の文字へ
if %nsw% GTR 0 goto get_dp_while01
call set ch=%%string:~%pos%,1%%
rem 次の文字が数字であればマイナス符号となります。
if %ch% GTR 0 set sign=-
if "%ch%" == "0" set sign=-
goto get_dp_while01
:get_dp_dp01
rem 数字と数字の間になければ小数点では無いので次の文字へ
if %nsw% EQU 0 set /a pos+=1&goto get_dp_while01
rem 小数点の場合、位置を記憶して次の文字へ
set dp=%nsw%
set /a pos+=1
goto get_dp_while01
:get_dp_next01
rem 数字を保存して次の文字へ
set /a nsw+=1
set /a pos+=1
set number=%number%%ch%
goto get_dp_while01
:get_dp_wend01
if %dp% EQU 0 set dp=%nsw%
rem 数値の頭にある0を削除します。
set number=%number%00000000.
:get_dp_zs
if %number:~0,1% EQU 0 set number=%number:~1%&set /a dp-=1&goto get_dp_zs
if "%number%" == "." set number=00000000
if %dp% GEQ 0 set dp=+%dp%
if "%sign%" =="-" (set number=-%number%) else (set number=+%number%)
rem 浮動小数点形式を整えます。
set number=%dp%%number%00000000
set number=%number:~0,11%
set get_dp=%number%
goto :EOF

:help
ECHO %0:浮動小数点計算(減算)
ECHO このバッチは、有効桁数 8桁、10の8乗(10^8)〜10の-8乗(10^-8)までの範囲
ECHO で、四則計算(減算)を行うプログラムです。
ECHO 浮動小数点の形式は、±p±xxxxxxxx(p:10のべき乗、0.xxxxxxxx:10進数8桁)
ECHO という表現をとっています。
ECHO (使い方)
ECHO %0 数値a 数値b
ECHO  数値a:-9999999〜99999999の範囲の数値
ECHO  数値b:-9999999〜99999999の範囲の数値
ECHO  小数は0.00000001〜0.99999999までを扱えます。
ECHO  ただし、整数部と小数部をあわせて8桁を超える部分は、切り捨てられます。
ECHO  また、小数は必ず0.123のように整数部を持たなければなりません。
ECHO  .123のような小数点から始まる数は、123と解釈します。
ECHO 与えた数値を元に減算を行ない、その結果を表示します。
ECHO 【実行例】
ECHO %0 123.456 -11.0101
ECHO 134.4661
ECHO.
ECHO 引数を与えなかった場合は、数値aと数値bの入力を求めます。
ECHO 数値a、を入力しなかった場合は、簡単な説明(この画面)を表示します。
ECHO 数値b、を入力しなかった場合は、「b=0」として計算します。
ECHO.
pause
exit /b

ページトップへ戻る

掛け算(乗算)

数値を上位と下位の2つに分けて計算しています。
比較的簡単な計算方法をとっていますのでわかりやすいと思います。
@title 乗算(浮動小数計算)
@echo off
set a=%~1
if "%a%" == "" set /p a=数値aを入力してください:
set b=%~2
if "%b%" == "" set /p b=数値bを入力してください:
if "%a%" == "" goto help
if "%b%" == "" set b=1

call :muldp %a% %b%
echo %muldp%

exit /b

REM ===============================================
:muldp
rem 初期化(spc:ダミーの空白(スペース), zero:ダミーの0,
rem     ec:小数点の位置, sc:実数部の符号, fc:実数部の符号のチェック)
set spc=(8桁の半角スペース)
set zero=00000000
set ec=0
set sc=+
set fc=0
call :get_dp %~1
set ea=%get_dp:~0,2%
set sa=%get_dp:~2,1%
set rah=%get_dp:~3,4%
set ral=%get_dp:~-4%
call :get_dp %~2
set eb=%get_dp:~0,2%
set sb=%get_dp:~2,1%
set rbh=%get_dp:~3,4%
set rbl=%get_dp:~-4%
rem 実数部の符号のチェック fc が0なら正、1なら負としています。
if "%sa%" == "-" set /a fc=1-%fc%
if "%sb%" == "-" set /a fc=1-%fc%
rem 数値a、数値bをそれぞれ上位と下位に分けて掛け算を行ないます。
set /a rc0=(%ral%)*(%rbl%)
set /a cb=%rc0%/10000
set /a rc0=%rc0%-cb*10000
set /a rc1=(%rah%)*(%rbl%)+cb
set /a rc2=(%ral%)*(%rbh%)+rc1
set /a cb=%rc2%/10000
set /a rc2=%rc2%-cb*10000
set /a rc3=(%rah%)*(%rbh%)+cb
set rc=%rc3%%rc2%%rc0%
rem 実数部の数値を整えます。
set rc=%rc%%zero%
set rc=%rc:~0,8%
if %fc% EQU 1 set sc=-
set /a ec=(%ea%)+(%eb%)-1
if %ec% GEQ 0 set ec=+%ec%
rem 計算結果が大きくなりすぎ(オーバーフロー)たり、小さく
rem    なりすぎ(アンダーフロー)た場合の対処
if %ec% GTR 8 set ec=+9&set rc=99999999
if %ec% LSS -8 set ec=-9&set rc=00000000
if %rc% EQU 0 set ec=-9&set rc=00000000
set float=%ec%%sc%%rc%
rem 浮動小数点形式から固定小数点(通常の表示方法)形式に変換します。
if %ec% GTR 0 call set int=%%rc:~0,%ec%%%.&call set flc=%%rc:~%ec%%%
if %ec% LSS 0 call set int=0.%%zero:~0,%ec%%%&set flc=%rc%
if %ec% EQU 0 set int=0.&set flc=%rc%
if %ec% GTR 8 call set int=999999999&call set flc=
set muldp=%sc%%int%%flc%
rem 数値の形式を整えます。
:muldp_zs
if %muldp:~-1% EQU 0 set muldp=%muldp:~0,-1%&goto muldp_zs
if "%muldp:~-1%" == "." set muldp=%muldp:~0,-1%
if "%muldp:~0,1%" == "+" set muldp=%muldp:~1%
if "%muldp%" == "-0" set muldp=0
rem echo a:%ea% %ra% b:%eb% %rb% c:%ec% %sc% %rc%
rem @echo off
goto :EOF

REM ===============================================
rem 与えられた数値を浮動小数点形式に変換します。
:get_dp
rem 初期化(string:数字文字列, number:浮動小数点への変換作業,
rem   nsw:数字の桁数, dp:小数点位置, pos:文字列中の位置, sign:数値の符号)
set string=%~1
set number=
set nsw=0
set dp=0
set pos=0
set sign=
:get_dp_while01
rem 文字列からchに1文字取り出して、数字と比較します。
call set ch=%%string:~%pos%,1%%
rem call echo set ch=%%string:~%pos%,1%%
if "%ch%" == "" goto get_dp_wend01
if "%ch%" == "0" goto get_dp_next01
if "%ch%" == "1" goto get_dp_next01
if "%ch%" == "2" goto get_dp_next01
if "%ch%" == "3" goto get_dp_next01
if "%ch%" == "4" goto get_dp_next01
if "%ch%" == "5" goto get_dp_next01
if "%ch%" == "6" goto get_dp_next01
if "%ch%" == "7" goto get_dp_next01
if "%ch%" == "8" goto get_dp_next01
if "%ch%" == "9" goto get_dp_next01
if "%ch%" == "." goto get_dp_dp01
if "%ch%" == "-" goto get_dp_minus
if %nsw% EQU 0 set /a pos+=1&goto get_dp_while01
goto get_dp_wend01
:get_dp_minus
set /a pos+=1
rem 数字の間にある場合は、マイナス符号で無いので次の文字へ
if %nsw% GTR 0 goto get_dp_while01
call set ch=%%string:~%pos%,1%%
rem 次の文字が数字であればマイナス符号となります。
if %ch% GTR 0 set sign=-
if "%ch%" == "0" set sign=-
goto get_dp_while01
:get_dp_dp01
rem 数字と数字の間になければ小数点では無いので次の文字へ
if %nsw% EQU 0 set /a pos+=1&goto get_dp_while01
rem 小数点の場合、位置を記憶して次の文字へ
set dp=%nsw%
set /a pos+=1
goto get_dp_while01
:get_dp_next01
rem 数字を保存して次の文字へ
set /a nsw+=1
set /a pos+=1
set number=%number%%ch%
goto get_dp_while01
:get_dp_wend01
if %dp% EQU 0 set dp=%nsw%
rem 数値の頭にある0を削除します。
set number=%number%00000000.
:get_dp_zs
if %number:~0,1% EQU 0 set number=%number:~1%&set /a dp-=1&goto get_dp_zs
if "%number%" == "." set number=00000000
if %dp% GEQ 0 set dp=+%dp%
if "%sign%" =="-" (set number=-%number%) else (set number=+%number%)
rem 浮動小数点形式を整えます。
set number=%dp%%number%00000000
set number=%number:~0,11%
set get_dp=%number%
goto :EOF

:help
ECHO %0:乗算(浮動小数点計算)
ECHO このバッチは、有効桁数 8桁、10の8乗(10^8)〜10の-8乗(10^-8)までの範囲
ECHO で、四則計算(乗算)を行うプログラムです。
ECHO 浮動小数点の形式は、±p±xxxxxxxx(p:10のべき乗、0.xxxxxxxx:10進数8桁)
ECHO という表現をとっています。
ECHO (使い方)
ECHO %0 数値a 数値b
ECHO  数値a:-9999999〜99999999の範囲の数値
ECHO  数値b:-9999999〜99999999の範囲の数値
ECHO  小数は0.00000001〜0.99999999までを扱えます。
ECHO  ただし、整数部と小数部をあわせて8桁を超える部分は、切り捨てられます。
ECHO  また、小数は必ず0.123のように整数部を持たなければなりません。
ECHO  .123のような小数点から始まる数は、123と解釈します。
ECHO 与えた数値を元に乗算を行ない、その結果を表示します。
ECHO 【実行例】
ECHO %0 123.456 -11.0101
ECHO -1359.2584
ECHO.
ECHO 引数を与えなかった場合は、数値aと数値bの入力を求めます。
ECHO 数値a、を入力しなかった場合は、簡単な説明(この画面)を表示します。
ECHO 数値b、を入力しなかった場合は、「b=1」として計算します。
ECHO.
pause
exit /b

ページトップへ戻る

割り算(除算)

単純な割り算を繰り返し、浮動小数点での有効桁数まで求めます。
@title 除算(浮動小数計算)
@echo off
set a=%~1
if "%a%" == "" set /p a=数値aを入力してください:
set b=%~2
if "%b%" == "" set /p b=数値bを入力してください:
if "%a%" == "" goto help
if "%b%" == "" set b=1

call :divdp %a% %b%
echo %divdp%

exit /b

REM ===============================================
:divdp
rem 初期化(spc:ダミーの空白(スペース), zero:ダミーの0,
rem    ec:小数点の位置, sc:実数部の符号, fc:実数部の符号のチェック)
set spc=(8桁の半角スペース)
set zero=00000000
set ec=0
set sc=+
set fc=0
call :get_dp %~1
set ea=%get_dp:~0,2%
set sa=%get_dp:~2,1%
set ra=%get_dp:~3%
call :get_dp %~2
set eb=%get_dp:~0,2%
set sb=%get_dp:~2,1%
set rb=%get_dp:~3%
rem 実数部の符号のチェック fc が0なら正、1なら負としています。
if "%sa%" == "-" set /a fc=1-%fc%
if "%sb%" == "-" set /a fc=1-%fc%
if %rb% EQU 0 set ec=99&goto div0
set rc=
rem 割り算のループ(9桁分を計算)
set cnt=0
:divdp_loop
if %cnt% GTR 8 goto end_divdp_loop
set /a q=ra/rb
set /a ra=ra-rb*q
set rc=%rc%%q%
set ra=%ra%0
set /a cnt+=1
goto divdp_loop
:end_divdp_loop
rem 小数点位置の計算
set /a ec=(%ea%)-(%eb%)+1
rem 商の先頭の0を削除します。
set rc=%rc%%zero%.
:divdp_zs
if %rc:~0,1% EQU 0 set /a ec-=1&set rc=%rc:~1%&goto divdp_zs
if "%rc%" == "." set rc=%zero%
if %fc% EQU 1 set sc=-
set rc=%rc:~0,8%
if %ec% GEQ 0 set ec=+%ec%
:div0
rem 計算結果が大きくなりすぎ(オーバーフロー)たり、小さく
rem    なりすぎ(アンダーフロー)た場合の対処
if %ec% GTR 8 set ec=+9&set rc=99999999
if %ec% LSS -8 set ec=-9&set rc=00000000
if %rc% EQU 0 set ec=-9&set rc=00000000
set float=%ec%%sc%%rc%
rem 浮動小数点形式から固定小数点(通常の表示方法)形式に変換します。
if %ec% GTR 0 call set int=%%rc:~0,%ec%%%.&call set flc=%%rc:~%ec%%%
if %ec% LSS 0 call set int=0.%%zero:~0,%ec%%%&set flc=%rc%
if %ec% EQU 0 set int=0.&set flc=%rc%
if %ec% GTR 8 call set int=999999999&call set flc=
set divdp=%sc%%int%%flc%
rem 数値の形式を整えます。
:divdp_zs1
if %divdp:~-1% EQU 0 set divdp=%divdp:~0,-1%&goto divdp_zs1
if "%divdp:~-1%" == "." set divdp=%divdp:~0,-1%
if "%divdp:~0,1%" == "+" set divdp=%divdp:~1%
if "%divdp%" == "-0" set divdp=0
rem @echo off
goto :EOF

REM ===============================================
rem 与えられた数値を浮動小数点形式に変換します。
:get_dp
rem 初期化(string:数字文字列, number:浮動小数点への変換作業,
rem    nsw:数字の桁数, dp:小数点位置, pos:文字列中の位置, sign:数値の符号)
set string=%~1
set number=
set nsw=0
set dp=0
set pos=0
set sign=
:get_dp_while01
rem 文字列からchに1文字取り出して、数字と比較します。
call set ch=%%string:~%pos%,1%%
rem call echo set ch=%%string:~%pos%,1%%
if "%ch%" == "" goto get_dp_wend01
if "%ch%" == "0" goto get_dp_next01
if "%ch%" == "1" goto get_dp_next01
if "%ch%" == "2" goto get_dp_next01
if "%ch%" == "3" goto get_dp_next01
if "%ch%" == "4" goto get_dp_next01
if "%ch%" == "5" goto get_dp_next01
if "%ch%" == "6" goto get_dp_next01
if "%ch%" == "7" goto get_dp_next01
if "%ch%" == "8" goto get_dp_next01
if "%ch%" == "9" goto get_dp_next01
if "%ch%" == "." goto get_dp_dp01
if "%ch%" == "-" goto get_dp_minus
if %nsw% EQU 0 set /a pos+=1&goto get_dp_while01
goto get_dp_wend01
:get_dp_minus
set /a pos+=1
rem 数字の間にある場合は、マイナス符号で無いので次の文字へ
if %nsw% GTR 0 goto get_dp_while01
call set ch=%%string:~%pos%,1%%
rem 次の文字が数字であればマイナス符号となります。
if %ch% GTR 0 set sign=-
if "%ch%" == "0" set sign=-
goto get_dp_while01
:get_dp_dp01
rem 数字と数字の間になければ小数点では無いので次の文字へ
if %nsw% EQU 0 set /a pos+=1&goto get_dp_while01
rem 小数点の場合、位置を記憶して次の文字へ
set dp=%nsw%
set /a pos+=1
goto get_dp_while01
:get_dp_next01
rem 数字を保存して次の文字へ
set /a nsw+=1
set /a pos+=1
set number=%number%%ch%
goto get_dp_while01
:get_dp_wend01
if %dp% EQU 0 set dp=%nsw%
rem 数値の頭にある0を削除します。
set number=%number%00000000.
:get_dp_zs
if %number:~0,1% EQU 0 set number=%number:~1%&set /a dp-=1&goto get_dp_zs
if "%number%" == "." set number=00000000
if %dp% GEQ 0 set dp=+%dp%
if "%sign%" =="-" (set number=-%number%) else (set number=+%number%)
rem 浮動小数点形式を整えます。
set number=%dp%%number%00000000
set number=%number:~0,11%
set get_dp=%number%
goto :EOF

:help
ECHO %0:浮動小数点計算
ECHO このバッチは、有効桁数 8桁、10の8乗(10^8)〜10の-8乗(10^-8)までの範囲
ECHO で、四則計算(除算)を行うプログラムです。
ECHO 浮動小数点の形式は、±p±xxxxxxxx(p:10のべき乗、0.xxxxxxxx:10進数8桁)
ECHO という表現をとっています。
ECHO (使い方)
ECHO %0 数値a 数値b
ECHO  数値a:-9999999〜99999999の範囲の数値
ECHO  数値b:-9999999〜99999999の範囲の数値
ECHO  小数は0.00000001〜0.99999999までを扱えます。
ECHO  ただし、整数部と小数部をあわせて8桁を超える部分は、切り捨てられます。
ECHO  また、小数は必ず0.123のように整数部を持たなければなりません。
ECHO  .123のような小数点から始まる数は、123と解釈します。
ECHO 与えた数値を元に除算を行ない、その結果を表示します。
ECHO 【実行例】
ECHO %0 123.456 -11.0101
ECHO 11.212977
ECHO.
ECHO 引数を与えなかった場合は、数値aと数値bの入力を求めます。
ECHO 数値a、を入力しなかった場合は、簡単な説明(この画面)を表示します。
ECHO 数値b、を入力しなかった場合は、「b=1」として計算します。
ECHO.
pause
exit /b

ページトップへ戻る

【ページ内見出し】
【サイト内リンク】

−広告エリア−




元のページに戻る  ページを閉じる

連絡先:お問い合わせフォーム