呵呵,不是说明,是用了中文的标号,有了中文标号连说明都可以省了!
联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!
精华I
查看 43,157 回复 136
Originally posted by qwe1234567 at 2006-10-23 03:55:
呵呵,不是说明,是用了中文的标号,有了中文标号连说明都可以省了!
Originally posted by qwe1234567 at 2006-10-23 04:18:
我这也是第一次用中文的标号,我想应该没有个数限制吧
Originally posted by namejm at 2006-10-4 21:08:
到目前为止,各位已经找到了CMD下计算浮点数的两种方法:
方法一:浮点数的整数部分和小数部分分别计算。实现的过程是:整数部分直接相加即可;小数部分稍微有点麻烦:如果小数部分位数不一致,则要以位数最多的那个数为基准,在另外一个数的小数部分补足0,然后再对小数部分作整数的加法;如果相加的结果位数超过了最长的位数,则要向整数部分进1,小数部分的最高位要相应地减1;
方法二:把整数部分和小数部分重组成一个新数,再对新数进行加法操作,最后把小数点插入原来的位置;
两种方法各自的优点和缺点:
方法一:优点:能处理的浮点数的范围很大,只要相加的结果在 (2^32-1.2^32-1) 和 -(2^32-1.2^32-1)之间,都能处理;缺点:大都出现在小数部分,如:若小数部分最高位为08或09都可能出错,要对这两种情况另作处理;小数部分相加结果的位数长度如果超过最长的位数,则要对整数部分做加1、对小数最高位作减1处理;如果扩充到三个或三个以上的浮点数进行加法操作,则进位的问题将更加复杂;
方法二:优点:不用另行处理08和09的情况,不用考虑进位的问题(看了楼下pengfei的分析,发现这个地方的描述有点问题,具体情况请参阅楼下的描述);缺点:能处理的浮点数范围比较小,相加结果去掉小数点之后新数值的范围在 (2^32-1.2^32-1) 和 -(2^32-1.2^32-1)之间才能成功。

@echo off
set aa=%1
set bb=%2
::调用浮点乘法函数
call :mul cc aa bb %3
echo %cc%
goto :eof
:mul
::浮点乘法函数,头尾都可带0,支持乘积为:49位整数,49位小数。
::第一个参数为接收变量名,第二、三个为相乘数变量名,第四个指定要保留小数位数
@echo off&setlocal enabledelayedexpansion
set cc=0
set ka=!%2:*.=!
set kb=!%3:*.=!
set maa=!%2:.=!
set mb=!%3:.=!
for /l %%a in (0,1,49) do if not "!maa:~%%a,1!"=="0" (set maa=!maa:~%%a!&goto :maaok)
:maaok
for /l %%a in (0,1,49) do if not "!mb:~%%a,1!"=="0" (set mb=!mb:~%%a!&goto :mbok)
:mbok
if "!kb!."=="!%3!." set kb=
if "!ka!."=="!%2!." set ka=
set kab=!kb!!ka!#
for /l %%a in (0,1,49) do if "!kab:~%%a,1!"=="#" (set kab=%%a&goto :lp1)
:lp1
if defined mb (set al=!mb:~-4!
if "!al:~0,1!"=="0" set/a al=1!al!-10000
set mb=!mb:~0,-4!
) else (goto :endmul)
set ma=!maa!
set zero=!mz!
set mz=!mz!0000
for /l %%a in (1,1,12) do (
if defined ma (set bl=!ma:~-4!
if "!bl:~0,1!"=="0" set/a bl=1!bl!-10000
set/a bl*=al&set ma=!ma:~0,-4!
) else (goto :end1)
set bl=!bl!!zero!
set zero=!zero!0000
call :add cc cc bl
)
:end1
goto :lp1
:endmul
if not %kab%==0 (
set ka=00000000000000000000000000000000000000000000000000%cc%
if "!cc:~0,-%kab%!"=="" (set cc=0.!ka:~-%kab%,%4!) else (set cc=!cc:~0,-%kab%!.!cc:~-%kab%,%4!)
)
endlocal&set %1=%cc%&goto :eof
:add
set xa=%cc%
set xb=%bl%
set cc=
set zz=0
set zy=
for /l %%a in (9,9,81) do (
if "!xa!!xb!"=="" goto :end
set cc=!zy!!cc!
if defined xa (set "aa=000000000!xa:~-9!"&set xa=!xa:~0,-9!) else (set aa=000000000)
if defined xb (set "bb=000000000!xb:~-9!"&set xb=!xb:~0,-9!) else (set bb=000000000)
set/a zz=!zz:~0,-9!+1!bb:~-9!-1000000000+1!aa:~-9!-1000000000
set zy=000000000!zz!
set zy=!zy:~-9!
)
:end
set cc=%zz%%cc%
if not %cc% gtr 0 goto :endok
if "%cc:~0,2%"=="0." goto :endok
for /l %%a in (0,1,36) do if not "!cc:~%%a,1!"=="0" (set cc=!cc:~%%a!&goto :endok)
:endok
goto :eof@echo off
set aa=%1
set bb=%2
::调用浮点乘法函数
echo %time%
call :mul cc aa bb %3
echo %time%
echo %cc%
goto :eof
::::::::::::::::::::::::::::::::::::::::::::::::::::::::
::
:mul <接收变量名> <被乘数> <乘数>
::
::浮点乘法函数,头尾都可带0,支持乘积为:49位整数,49位小数。
::第一个参数为接收变量名,第二、三个为相乘数变量名,第四个批定要保留小数位数
::最大位数计算仅需12毫秒
::别看代码那么长,速度可不慢
::::::::::::::::::::::::::::::::::::::::::::::::::::::::
@echo off&setlocal enabledelayedexpansion
set cc=0
set ka=!%2:*.=!
set kb=!%3:*.=!
set maa=!%2:.=!
set mb=!%3:.=!
for /l %%a in (0,1,49) do if not "!maa:~%%a,1!"=="0" (set maa=!maa:~%%a!&goto :maaok)
:maaok
for /l %%a in (0,1,49) do if not "!mb:~%%a,1!"=="0" (set mb=!mb:~%%a!&goto :mbok)
:mbok
if "!kb!."=="!%3!." set kb=
if "!ka!."=="!%2!." set ka=
set kab=!kb!!ka!#
for /l %%a in (0,1,49) do if "!kab:~%%a,1!"=="#" (set kab=%%a&goto :lp1)
set mz=
:lp1
if defined mb (set al=!mb:~-4!
if "!al:~0,1!"=="0" set/a al=1!al!-10000
set mb=!mb:~0,-4!
) else (goto :endmul)
set ma=!maa!
set "cl= "
for /l %%a in (1,4,91) do (
if not defined ma (goto :end1)
set bl=!ma:~-4!
if "!bl:~0,1!"=="0" set/a bl=1!bl!-10000
set/a bl=!cl:~0,-%%a!+bl*al
set ma=!ma:~0,-4!
set cl=0000!cl:~-%%a!
set cl=!bl!!cl:~-%%a!
)
:end1
set cl=%cl:~0,-1%%mz%
set mz=!mz!0000
set xa=%cc%
set xb=%cl%
set cc=
set zz=0
set zy=
for /l %%a in (9,9,81) do (
if "!xa!!xb!"=="" goto :end2
set cc=!zy!!cc!
if defined xa (set "aa=000000000!xa:~-9!"&set xa=!xa:~0,-9!) else (set aa=000000000)
if defined xb (set "bb=000000000!xb:~-9!"&set xb=!xb:~0,-9!) else (set bb=000000000)
set/a zz=!zz:~0,-9!+1!bb:~-9!-1000000000+1!aa:~-9!-1000000000
set zy=000000000!zz!
set zy=!zy:~-9!
)
:end2
set cc=%zz%%cc%
if not %cc% gtr 0 goto :lp1
for /l %%a in (0,1,36) do if not "!cc:~%%a,1!"=="0" (set cc=!cc:~%%a!&goto :lp1)
goto :lp1
:endmul
if not %kab%==0 (
set ka=00000000000000000000000000000000000000000000000000%cc%
if "!cc:~0,-%kab%!"=="" (set cc=0.!ka:~-%kab%,%4!) else (set cc=!cc:~0,-%kab%!.!cc:~-%kab%,%4!)
)
endlocal&set %1=%cc%&goto :eof