昨日までの準備した関数を使って、答えを出すことができます。
平方根やlogも用意してもいいのですが、この問題では外で計算しておいてもよいでしょう。
log10√5 = 0.34948500…
log10(1 + √5)/2 = 0.20898764…
なので、8桁取って、下なら20898764/100000000を計算すればよいでしょう。これを使って計算します。
@echo off setlocal enabledelayedexpansion call :int2float 349485 set /a a = %ERRORLEVEL% call :int2float 1000000 call :divide_float %a% %ERRORLEVEL% set /a m = %ERRORLEVEL% call :int2float 20898764 set /a a = %ERRORLEVEL% call :int2float 100000000 call :divide_float %a% %ERRORLEVEL% set /a n = %ERRORLEVEL% call :int2float 999 call :add_float %ERRORLEVEL% %m% call :divide_float %ERRORLEVEL% %n% call :float2int %ERRORLEVEL% set /a r = %ERRORLEVEL% + 1 echo %r% exit /b 0 :int2float setlocal call :encode_float %1 23 exit /b %ERRORLEVEL% :float2int setlocal call :decode_float %1 if %exp% LSS 23 ( set /a n = "sig >> (23 - exp)" ) else ( set /a n = "sig << (exp - 23)" ) exit /b %n% :add_float setlocal call :align_exp %1 %2 set /a sig = %sig1% + %sig2% call :encode_float %sig% %exp1% exit /b %ERRORLEVEL% :subtract_float setlocal call :align_exp %1 %2 set /a sig = %sig1% - %sig2% call :encode_float %sig% %exp1% exit /b %ERRORLEVEL% :multiply_float setlocal call :remove_sign %1 %2 set /a a1 = "sig1 >> 12" set /a b1 = "sig1 & 0xFFF" set /a a2 = "sig2 >> 12" set /a b2 = "sig2 & 0xFFF" set /a m3 = %b1% * %b2% set /a m2 = %a1% * %b2% + %a2% * %b1% + "(m3 >> 12)" set /a m1 = %a1% * %a2% + "(m2 >> 12)" set /a "m1 <<= 1" set /a sign = "sign1 ^ sign2" if %sign% == 1 set /a m1 = -%m1% set /a exp = %exp1% + %exp2% call :encode_float %m1% %exp% exit /b %ERRORLEVEL% :divide_float setlocal call :remove_sign %1 %2 if %sig1% LSS %sig2% ( set /a "sig1 <<= 1" set /a exp1 -= 1 ) set /a sig = 0 for /L %%k in (1, 1, 24) do ( set /a sig = "(!sig! << 1) + !sig1! / sig2" set /a sig1 = !sig1! %% %sig2% * 2 ) set /a sign = "sign1 ^ sign2" if %sign% == 1 set /a sig = -%sig% set /a exp = %exp1% - %exp2% call :encode_float %sig% %exp% exit /b %ERRORLEVEL% :remove_sign call :decode_float %1 1 call :decode_float %2 2 set /a sign1 = 0 if %sig1% LSS 0 ( set /a sign1 = 1 set /a sig1 = -%sig1% ) set /a sign2 = 0 if %sig2% LSS 0 ( set /a sign2 = 1 set /a sig2 = -%sig2% ) exit /b 0 :align_exp call :decode_float %1 1 call :decode_float %2 2 if %exp1% GTR %exp2% ( set /a de = %exp1% - %exp2% set /a "sig2 >>= !de!" ) else ( set /a de = %exp2% - %exp1% set /a "sig1 >>= !de!" set /a exp1 += !de! ) exit /b 0 :encode_float setlocal if %1 == 0 exit /b 0 if %1 GTR 0 ( set /a sig = %1 ) else ( set /a sig = -%1 ) set /a sign = "%1 & 0x80000000" set /a e = %2 :loop_encode_float if %sig% GEQ 0x1000000 ( set /a "sig >>= 1" set /a e += 1 goto :loop_encode_float ) if %sig% LSS 0x800000 ( set /a "sig <<= 1" set /a e -= 1 goto :loop_encode_float ) set /a sig -= 0x800000 set /a code = "sig | ((e + 127) << 23) | sign" exit /b %code% :decode_float set /a sig%2 = "(%1 & 0x7FFFFF) + 0x800000" set /a exp%2 = "((%1 >> 23) & 0xFF) - 127" set /a sign = "%1 >> 31" if %sign% == -1 set /a sig%2 = "-sig%2" exit /b 0