标题: [数值计算] 一个简单的浮点运算工具——floatc.bat [打印本页]
作者: dengyuli 时间: 2014-10-11 15:13 标题: 一个简单的浮点运算工具——floatc.bat
本帖最后由 dengyuli 于 2014-10-11 15:25 编辑
这个批处理的浮点计算的原理很简单,就是生成vbs文件然后运行它,VBS将值输出到临时文件,然后bat读取临时文件中的值并输出到屏幕,并把值赋给变量%output%
最后清除临时文件和vbs脚本。这个批处理是原创作品。
它还可以比较两个浮点数的大小,支持以下运算:
+,-,*,/,sqr(),sin(),cos(),tan(),ln(),abs(),^(乘方(在表达式中乘方符号为^^^^)) 其中ln()在表达式中应该写成log()
主要缺点:计算速度慢(一般在0.5秒以内,有些时候需要1-2秒)
全部代码如下:- @echo off
- echo ^0>a
- if "%1" == "/?" goto:usage
- if "%1" == "" goto:usage
- if "%1" == "/b" goto:bijiao
- echo c=^%1>>temp.vbe
- echo set fso=createobject^(^"scripting.filesystemobject^"^).opentextfile^(^"a^",2^)>>temp.vbe
- echo fso.write c>>temp.vbe
- goto:r
- :bijiao
- if "%2" == "" echo 错误:缺少值 & echo= & echo 请输入floatc ^/^?查看帮助 & goto:end
- if "%3" == "" echo 错误:缺少值 & echo= & echo 请输入floatc ^/^?查看帮助 & goto:end
- echo set fso=createobject^(^"scripting.filesystemobject^"^).opentextfile^(^"a^",2^)>>temp.vbe
- echo a=^%2>>temp.vbe
- echo b=^%3>>temp.vbe
- echo if a^<b then>>temp.vbe
- echo c=^0>>temp.vbe
- echo fso.write c>>temp.vbe
- echo end if>>temp.vbe
- echo if a=b then>>temp.vbe
- echo c=^1>>temp.vbe
- echo fso.write c>>temp.vbe
- echo end if>>temp.vbe
- echo if a^>b then>>temp.vbe
- echo c=^2>>temp.vbe
- echo fso.write c>>temp.vbe
- echo end if>>temp.vbe
- :r
- call temp.vbe
- set /p output=<a
- echo %output%
- del /f /q temp.vbe >nul
- del /f /q a >nul
- goto:end
- :usage
- echo %~nx0 -- 浮点运算器
- echo=
- echo 用法1:%~nx0 [表达式]
- echo 用法2:%~nx0 ^/b [值1] [值2]
- echo 例:%~nx0 sqr(2)
- echo 输出结果:1.414213562
- echo 如果浮点数在-1和1之间,将省略小数点前的0
- echo 表达式格式与vbs中的表达式相同
- echo=
- echo 注意事项:使用 乘方 和使用 两个加数都是整数的加法 时:
- echo 加法:在加数和被加数的后面要分别加上四个"^",然后加上一个1,
- echo 例如:%~nx0 2^^^^^^^^1+3^^^^^^^^1
- echo 乘方:乘方符号为四个"^"
- echo=
- echo 当值大到一定程度时,会用科学计数法表示,其格式为:X.XXXXXXXE+Y
- echo 用科学计数法表示的数仍然可以比较其大小
- echo=
- echo ^/b 比较值1和值2的大小(值1和值2缺一不可,均可以为浮点数)
- echo 值1比值2小:输出0
- echo 值1等于值2:输出1
- echo 值1比值2大:输出2
- echo=
- :end
复制代码
作者: dengyuli 时间: 2014-10-12 10:08
本帖最后由 dengyuli 于 2014-10-12 10:09 编辑
现在,floatc的功能已增强。
新功能:比较两浮点数的大小,若符合条件则执行特定命令,否则不执行。
全部代码如下:- @echo off
- echo ^0>a
- if "%1" == "/?" goto:usage
- if "%1" == "" goto:usage
- if "%1" == "/b" goto:bijiao
- echo c=^%1>>temp.vbe
- echo set fso=createobject^(^"scripting.filesystemobject^"^).opentextfile^(^"a^",2^)>>temp.vbe
- echo fso.write c>>temp.vbe
- goto:r
- :bijiao
- if "%2" == "/i" goto:fif
- if "%2" == "" echo 错误:缺少值 & echo= & echo 请输入floatc ^/^?查看帮助 & goto:end
- if "%3" == "" echo 错误:缺少值 & echo= & echo 请输入floatc ^/^?查看帮助 & goto:end
- echo set fso=createobject^(^"scripting.filesystemobject^"^).opentextfile^(^"a^",2^)>>temp.vbe
- echo a=^%2>>temp.vbe
- echo b=^%3>>temp.vbe
- echo if a^<b then>>temp.vbe
- echo c=^0>>temp.vbe
- echo fso.write c>>temp.vbe
- echo end if>>temp.vbe
- echo if a=b then>>temp.vbe
- echo c=^1>>temp.vbe
- echo fso.write c>>temp.vbe
- echo end if>>temp.vbe
- echo if a^>b then>>temp.vbe
- echo c=^2>>temp.vbe
- echo fso.write c>>temp.vbe
- echo end if>>temp.vbe
- goto:r
- :fif
- if "%4"=="gtr" set "f=>"
- if "%4"=="equ" set "f=="
- if "%4"=="lss" set "f=<"
- echo set fso=createobject^(^"scripting.filesystemobject^"^).opentextfile^(^"a^",2^)>>temp.vbe
- echo a=^%3>>temp.vbe
- echo b=^%5>>temp.vbe
- echo if a^%f%b then>>temp.vbe
- echo c=^1>>temp.vbe
- echo fso.write c>>temp.vbe
- echo else>>temp.vbe
- echo c=^0>>temp.vbe
- echo fso.write c>>temp.vbe
- echo end if>>temp.vbe
- call temp.vbe
- set /p bool=<a
- if %bool%==1 (
- for /f "delims= tokens=* eol=~" %%a in ('echo %6') do (
- %%~a
- )
- ) else (
- break
- )
- del /f /q temp.vbe >nul
- del /f /q a >nul
- goto:end
- :r
- call temp.vbe
- set /p output=<a
- echo %output%
- del /f /q temp.vbe >nul
- del /f /q a >nul
- goto:end
- :usage
- echo %~nx0 -- 浮点运算器
- echo=
- echo 用法1:%~nx0 [表达式]
- echo 用法2:%~nx0 ^/b [值1] [值2]
- echo 用法3:%~nx0 ^/b ^/i [值1] [lss^|equ^|gtr] [值2] [命令(要用双引号括起来)]
- echo 例:%~nx0 sqr(2)
- echo 输出结果:1.414213562
- echo 如果浮点数在-1和1之间,将省略小数点前的0
- echo 表达式格式与vbs中的表达式相同
- echo=
- echo 注意事项:使用 乘方 和使用 两个加数都是整数的加法 时:
- echo 加法:在加数和被加数的后面要分别加上四个"^",然后加上一个1,
- echo 例如:%~nx0 2^^^^^^^^1+3^^^^^^^^1
- echo 乘方:乘方符号为四个"^"
- echo 此工具不宜被频繁调用,否则将会发生不可预料的错误!
- echo=
- echo 当值大到一定程度时,会用科学计数法表示,其格式为:X.XXXXXXXE+Y
- echo 用科学计数法表示的数仍然可以比较其大小
- echo=
- echo ^/b 比较值1和值2的大小(^/b必须是第一个选项,值1和值2均可以为浮点数)
- echo 值1比值2小:输出0
- echo 值1等于值2:输出1
- echo 值1比值2大:输出2
- echo=
- echo ^/i 比较两浮点数的大小,若符合条件则执行特定的命令,^/i开关必须
- echo 在^/b开关后面
- echo=
- :end
复制代码
作者: dengyuli 时间: 2014-10-12 12:18
实例:用floatc.bat算任意底数的对数(vbs中只能算以e为底的对数)- @echo off
- setlocal enabledelayedexpansion
- :main
- set d=-10
- set jqd=.1
- set ctr=0
- cls
- set /p a=请输入底数:
- set /p b=请输入真数:
- if !a!==1 goto:main
- if !a!==0 goto:main
- if !a!==!b! set result=1 & goto:done
- if !b!==1 set result=0 & goto:done
- :calculat
- cls
- echo 计算中……(这可能要花费你几分钟时间)
- echo 结果可能为:!d!
- call floatc !a!^^^^^^^^!d! >nul
- set c=!output!
- call floatc /b !c! !b! >nul
- if !output!==2 call floatc !d!-!jqd! >nul & set d=!output! & set jqd=!jqd:~0,1!0!jqd:~1! & set /a ctr+=1
- if !output!==1 set result=!d! & goto:done
- if !ctr! geq 12 set result=!d! & goto:done
- if !output!==0 call floatc !d!+!jqd! >nul & set d=!output!
- goto:calculat
- :done
- cls
- echo 结果为:!result!
- pause>nul
- goto:main
复制代码
作者: dengyuli 时间: 2014-10-18 19:17
现在,floatc的功能已增强:1、增加了开关/v
具体作用见批处理内的帮助部分。复制代码
欢迎光临 批处理之家 (http://bathome.net./) |
Powered by Discuz! 7.2 |