[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[数值计算] 一个简单的浮点运算工具——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秒)
全部代码如下:
  1. @echo off
  2. echo ^0>a
  3. if "%1" == "/?" goto:usage
  4. if "%1" == "" goto:usage
  5. if "%1" == "/b" goto:bijiao
  6. echo c=^%1>>temp.vbe
  7. echo set fso=createobject^(^"scripting.filesystemobject^"^).opentextfile^(^"a^",2^)>>temp.vbe
  8. echo fso.write c>>temp.vbe
  9. goto:r
  10. :bijiao
  11. if "%2" == "" echo 错误:缺少值 & echo= & echo  请输入floatc ^/^?查看帮助 & goto:end
  12. if "%3" == "" echo 错误:缺少值 & echo= & echo  请输入floatc ^/^?查看帮助 & goto:end
  13. echo set fso=createobject^(^"scripting.filesystemobject^"^).opentextfile^(^"a^",2^)>>temp.vbe
  14. echo a=^%2>>temp.vbe
  15. echo b=^%3>>temp.vbe
  16. echo if a^<b then>>temp.vbe
  17. echo c=^0>>temp.vbe
  18. echo fso.write c>>temp.vbe
  19. echo end if>>temp.vbe
  20. echo if a=b then>>temp.vbe
  21. echo c=^1>>temp.vbe
  22. echo fso.write c>>temp.vbe
  23. echo end if>>temp.vbe
  24. echo if a^>b then>>temp.vbe
  25. echo c=^2>>temp.vbe
  26. echo fso.write c>>temp.vbe
  27. echo end if>>temp.vbe
  28. :r
  29. call temp.vbe
  30. set /p output=<a
  31. echo %output%
  32. del /f /q temp.vbe >nul
  33. del /f /q a >nul
  34. goto:end
  35. :usage
  36. echo %~nx0 -- 浮点运算器
  37. echo=
  38. echo       用法1:%~nx0 [表达式]
  39. echo       用法2:%~nx0 ^/b [值1] [值2]
  40. echo       例:%~nx0 sqr(2)
  41. echo       输出结果:1.414213562
  42. echo       如果浮点数在-1和1之间,将省略小数点前的0
  43. echo       表达式格式与vbs中的表达式相同
  44. echo=
  45. echo       注意事项:使用 乘方 和使用 两个加数都是整数的加法 时:
  46. echo       加法:在加数和被加数的后面要分别加上四个"^",然后加上一个1,
  47. echo       例如:%~nx0 2^^^^^^^^1+3^^^^^^^^1
  48. echo       乘方:乘方符号为四个"^"
  49. echo=
  50. echo       当值大到一定程度时,会用科学计数法表示,其格式为:X.XXXXXXXE+Y
  51. echo       用科学计数法表示的数仍然可以比较其大小
  52. echo=
  53. echo       ^/b    比较值1和值2的大小(值1和值2缺一不可,均可以为浮点数)
  54. echo              值1比值2小:输出0
  55. echo              值1等于值2:输出1
  56. echo              值1比值2大:输出2
  57. echo=
  58. :end
复制代码

本帖最后由 dengyuli 于 2014-10-12 10:09 编辑

现在,floatc的功能已增强。
新功能:比较两浮点数的大小,若符合条件则执行特定命令,否则不执行。
全部代码如下:
  1. @echo off
  2. echo ^0>a
  3. if "%1" == "/?" goto:usage
  4. if "%1" == "" goto:usage
  5. if "%1" == "/b" goto:bijiao
  6. echo c=^%1>>temp.vbe
  7. echo set fso=createobject^(^"scripting.filesystemobject^"^).opentextfile^(^"a^",2^)>>temp.vbe
  8. echo fso.write c>>temp.vbe
  9. goto:r
  10. :bijiao
  11. if "%2" == "/i" goto:fif
  12. if "%2" == "" echo 错误:缺少值 & echo= & echo  请输入floatc ^/^?查看帮助 & goto:end
  13. if "%3" == "" echo 错误:缺少值 & echo= & echo  请输入floatc ^/^?查看帮助 & goto:end
  14. echo set fso=createobject^(^"scripting.filesystemobject^"^).opentextfile^(^"a^",2^)>>temp.vbe
  15. echo a=^%2>>temp.vbe
  16. echo b=^%3>>temp.vbe
  17. echo if a^<b then>>temp.vbe
  18. echo c=^0>>temp.vbe
  19. echo fso.write c>>temp.vbe
  20. echo end if>>temp.vbe
  21. echo if a=b then>>temp.vbe
  22. echo c=^1>>temp.vbe
  23. echo fso.write c>>temp.vbe
  24. echo end if>>temp.vbe
  25. echo if a^>b then>>temp.vbe
  26. echo c=^2>>temp.vbe
  27. echo fso.write c>>temp.vbe
  28. echo end if>>temp.vbe
  29. goto:r
  30. :fif
  31. if "%4"=="gtr" set "f=>"
  32. if "%4"=="equ" set "f=="
  33. if "%4"=="lss" set "f=<"
  34. echo set fso=createobject^(^"scripting.filesystemobject^"^).opentextfile^(^"a^",2^)>>temp.vbe
  35. echo a=^%3>>temp.vbe
  36. echo b=^%5>>temp.vbe
  37. echo if a^%f%b then>>temp.vbe
  38. echo c=^1>>temp.vbe
  39. echo fso.write c>>temp.vbe
  40. echo else>>temp.vbe
  41. echo c=^0>>temp.vbe
  42. echo fso.write c>>temp.vbe
  43. echo end if>>temp.vbe
  44. call temp.vbe
  45. set /p bool=<a
  46. if %bool%==1 (
  47. for /f "delims= tokens=* eol=~" %%a in ('echo %6') do (
  48.   %%~a
  49. )
  50. ) else (
  51. break
  52. )
  53. del /f /q temp.vbe >nul
  54. del /f /q a >nul
  55. goto:end
  56. :r
  57. call temp.vbe
  58. set /p output=<a
  59. echo %output%
  60. del /f /q temp.vbe >nul
  61. del /f /q a >nul
  62. goto:end
  63. :usage
  64. echo %~nx0 -- 浮点运算器
  65. echo=
  66. echo       用法1:%~nx0 [表达式]
  67. echo       用法2:%~nx0 ^/b [值1] [值2]
  68. echo       用法3:%~nx0 ^/b ^/i [值1] [lss^|equ^|gtr] [值2] [命令(要用双引号括起来)]
  69. echo       例:%~nx0 sqr(2)
  70. echo       输出结果:1.414213562
  71. echo       如果浮点数在-1和1之间,将省略小数点前的0
  72. echo       表达式格式与vbs中的表达式相同
  73. echo=
  74. echo       注意事项:使用 乘方 和使用 两个加数都是整数的加法 时:
  75. echo       加法:在加数和被加数的后面要分别加上四个"^",然后加上一个1,
  76. echo       例如:%~nx0 2^^^^^^^^1+3^^^^^^^^1
  77. echo       乘方:乘方符号为四个"^"
  78. echo       此工具不宜被频繁调用,否则将会发生不可预料的错误!
  79. echo=
  80. echo       当值大到一定程度时,会用科学计数法表示,其格式为:X.XXXXXXXE+Y
  81. echo       用科学计数法表示的数仍然可以比较其大小
  82. echo=
  83. echo       ^/b    比较值1和值2的大小(^/b必须是第一个选项,值1和值2均可以为浮点数)
  84. echo              值1比值2小:输出0
  85. echo              值1等于值2:输出1
  86. echo              值1比值2大:输出2
  87. echo=
  88. echo       ^/i    比较两浮点数的大小,若符合条件则执行特定的命令,^/i开关必须
  89. echo             在^/b开关后面
  90. echo=
  91. :end
复制代码

TOP

实例:用floatc.bat算任意底数的对数(vbs中只能算以e为底的对数)
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. :main
  4. set d=-10
  5. set jqd=.1
  6. set ctr=0
  7. cls
  8. set /p a=请输入底数:
  9. set /p b=请输入真数:
  10. if !a!==1 goto:main
  11. if !a!==0 goto:main
  12. if !a!==!b! set result=1 & goto:done
  13. if !b!==1 set result=0 & goto:done
  14. :calculat
  15. cls
  16. echo 计算中……(这可能要花费你几分钟时间)
  17. echo 结果可能为:!d!
  18. call floatc !a!^^^^^^^^!d! >nul
  19. set c=!output!
  20. call floatc /b !c! !b! >nul
  21. if !output!==2 call floatc !d!-!jqd! >nul & set d=!output! & set jqd=!jqd:~0,1!0!jqd:~1! & set /a ctr+=1
  22. if !output!==1 set result=!d! & goto:done
  23. if !ctr! geq 12 set result=!d! & goto:done
  24. if !output!==0 call floatc !d!+!jqd! >nul & set d=!output!
  25. goto:calculat
  26. :done
  27. cls
  28. echo 结果为:!result!
  29. pause>nul
  30. goto:main
复制代码

TOP

现在,floatc的功能已增强:1、增加了开关/v
具体作用见批处理内的帮助部分。
  1. @echo off
  2. echo ^0>a
  3. if "%1" == "/?" goto:usage
  4. if "%1" == "" goto:usage
  5. if "%1" == "/b" goto:bijiao
  6. if "%1" == "/v" goto:rv
  7. echo c=^%1>>temp.vbe
  8. echo set fso=createobject^(^"scripting.filesystemobject^"^).opentextfile^(^"a^",2^)>>temp.vbe
  9. echo fso.write c>>temp.vbe
  10. goto:r
  11. :bijiao
  12. if "%2" == "/i" goto:fif
  13. if "%2" == "" echo 错误:缺少值 & echo= & echo  请输入floatc ^/^?查看帮助 & goto:end
  14. if "%3" == "" echo 错误:缺少值 & echo= & echo  请输入floatc ^/^?查看帮助 & goto:end
  15. echo set fso=createobject^(^"scripting.filesystemobject^"^).opentextfile^(^"a^",2^)>>temp.vbe
  16. echo a=^%2>>temp.vbe
  17. echo b=^%3>>temp.vbe
  18. echo if a^<b then>>temp.vbe
  19. echo c=^0>>temp.vbe
  20. echo fso.write c>>temp.vbe
  21. echo end if>>temp.vbe
  22. echo if a=b then>>temp.vbe
  23. echo c=^1>>temp.vbe
  24. echo fso.write c>>temp.vbe
  25. echo end if>>temp.vbe
  26. echo if a^>b then>>temp.vbe
  27. echo c=^2>>temp.vbe
  28. echo fso.write c>>temp.vbe
  29. echo end if>>temp.vbe
  30. goto:r
  31. :fif
  32. if "%4"=="gtr" set "f=>"
  33. if "%4"=="equ" set "f=="
  34. if "%4"=="lss" set "f=<"
  35. echo set fso=createobject^(^"scripting.filesystemobject^"^).opentextfile^(^"a^",2^)>>temp.vbe
  36. echo a=^%3>>temp.vbe
  37. echo b=^%5>>temp.vbe
  38. echo if a^%f%b then>>temp.vbe
  39. echo c=^1>>temp.vbe
  40. echo fso.write c>>temp.vbe
  41. echo else>>temp.vbe
  42. echo c=^0>>temp.vbe
  43. echo fso.write c>>temp.vbe
  44. echo end if>>temp.vbe
  45. call temp.vbe
  46. set /p bool=<a
  47. if %bool%==1 (
  48. for /f "delims= tokens=* eol=~" %%a in ('echo %6') do (
  49.   %%~a
  50. )
  51. ) else (
  52. break
  53. )
  54. del /f /q temp.vbe >nul
  55. del /f /q a >nul
  56. goto:eof
  57. :r
  58. call temp.vbe
  59. set /p output=<a
  60. echo %output%
  61. del /f /q temp.vbe >nul
  62. del /f /q a >nul
  63. goto:eof
  64. :rv
  65. echo c=^%3>>temp.vbe
  66. echo set fso=createobject^(^"scripting.filesystemobject^"^).opentextfile^(^"a^",2^)>>temp.vbe
  67. echo fso.write c>>temp.vbe
  68. call temp.vbe
  69. set /p %2=<a
  70. del /f /q temp.vbe >nul
  71. del /f /q a >nul
  72. goto:eof
  73. :usage
  74. echo %~nx0 -- 浮点运算器
  75. echo=
  76. echo       用法1:%~nx0 [表达式]
  77. echo       用法2:%~nx0 ^/b [值1] [值2]
  78. echo       用法3:%~nx0 ^/b ^/i [值1] [lss^|equ^|gtr] [值2] [命令(要用引号括起来,命令中不能有其他引号)]
  79. echo       用法4:%~nx0 ^/v [变量名] [表达式]
  80. echo       例:%~nx0 sqr(2)
  81. echo       输出结果:1.414213562
  82. echo       如果浮点数在-1和1之间,将省略小数点前的0
  83. echo       表达式格式与vbs中的表达式相同
  84. echo=
  85. echo       注意事项:使用 乘方 和使用 两个加数都是整数的加法 时:
  86. echo       加法:在加数和被加数的后面要分别加上四个"^",然后加上一个1,
  87. echo       例如:%~nx0 2^^^^^^^^1+3^^^^^^^^1
  88. echo       乘方:乘方符号为四个"^",在批处理中为八个
  89. echo       此工具不宜被频繁调用,否则将会发生不可预料的错误!
  90. echo=
  91. echo       当值大到一定程度时,会用科学计数法表示,其格式为:X.XXXXXXXE+Y
  92. echo       用科学计数法表示的数仍然可以比较其大小
  93. pause>nul
  94. echo=
  95. echo       ^/b    比较值1和值2的大小(^/b必须是第一个选项,值1和值2均可以为浮点数)
  96. echo              值1比值2小:输出0
  97. echo              值1等于值2:输出1
  98. echo              值1比值2大:输出2
  99. echo=
  100. echo       ^/i    比较两浮点数的大小,若符合条件则执行特定的命令,^/i开关必须
  101. echo             在^/b开关后面
  102. echo=
  103. echo       ^/v    将表达式的计算结果赋给用户指定的变量
  104. echo=
复制代码

TOP

返回列表