Board logo

标题: 批处理计算根号(1-99) [打印本页]

作者: a2002    时间: 2017-7-8 12:07     标题: 批处理计算根号(1-99)

本帖最后由 a2002 于 2017-7-8 12:08 编辑

这是一个计算2次方根的程序(1到99以内的数),源码如下:
  1. @echo off&setlocal enabledelayedexpansion
  2. set /p "a=数(1-99):"
  3. set /p "loop=保留的有效数字:"
  4. set s=0&set r=&set y=!a!
  5. :loop
  6. if "!loop!" equ "!_loop!" goto :ans
  7. set /a _loop+=1
  8. for /l %%a in (1,1,10) do (
  9. set /a t1=s*20*%%a+%%a*%%a
  10. if !t1! gtr !y! (
  11. set /a n=%%a-1,_s=s*20*n+n*n,y=y*100-_s*100
  12. set r=!r!!n!&set s=!r!
  13. if !y! equ 0 goto :ans
  14. goto :loop
  15. )
  16. )
  17. :ans
  18. echo 结果:!r:~0,1!.!r:~1!
  19. pause>nul
复制代码
大于100、小于1的数原理相同,不再详述
作者: a2002    时间: 2017-7-8 12:15

原理:
这是一个很少有人知道的笔算法
例子:计算根2
2=1*1+1                                  ;第一位,1,余数,1
余数*100:1*100=100             ;便于除
商4,(1*20+4)*4=96            ;商4
100-96=4                                 ;余数
4*100=400                              ;便于除
商1,(14*20+1)*1=281        ;商1
400-281=119                           ;余数
119*100=11900                      ;便于除
…………
作者: a2002    时间: 2017-7-8 12:19

竖式:
作者: a2002    时间: 2017-7-8 12:22

由于P计算最大为2^31-1,所以有时末尾不能显示,正常现象
作者: 523066680    时间: 2017-7-8 12:42

本帖最后由 523066680 于 2017-7-8 12:45 编辑

是牛顿迭代法?忘得差不多了

你肯定不知道卡马克,卡神。
作者: a2002    时间: 2017-7-8 13:06

本帖最后由 a2002 于 2017-7-8 13:08 编辑
你肯定不知道卡马克,卡神。
523066680 发表于 2017-7-8 12:42



    这个确实不知道,毕竟没高中嘛,没必要懂那么多
作者: 523066680    时间: 2017-7-8 13:17

本帖最后由 523066680 于 2017-7-8 13:19 编辑

回复 6# a2002

    卡马克是个传奇,也不是说高中不高中。
他在自己开发的3D游戏的源码中,用了一个神奇的数字,快速求平方根。

http://blog.chinaunix.net/uid-9255716-id-107951.html

http://www.matrix67.com/blog/archives/362

传奇事迹:
http://baike.baidu.com/link?url= ... oAm0ZHJtsjPEjzSESGW
作者: happy886rr    时间: 2017-7-8 15:54

回复 1# a2002
这个算法在1985年之前,几乎所有初中的学校都会教的,是笔算开平方的算法。我在小学时研究过,当时改进到了笔算开立方(开立方时: 3*结果的平方)。

而卡马克算法  只在快速估算有限精度的开方,因为当时还没有FPU浮点指令集,卡马克在写游戏时,尤其在3D图形编程时,经常遇到开方之类的,当时的C库效率也不是很高,于是他鬼使神差的整出了0x5f3759df这个值(后来证实换成0x5f375a86会更好)。
作者: 523066680    时间: 2017-7-8 17:06

If you really like game development, then you must know John Carmack.
作者: a2002    时间: 2017-7-8 18:03

回复 8# happy886rr


    都是很厉害的了,小学就能研究^1/3,佩服
作者: a2002    时间: 2017-7-8 18:08

回复 8# happy886rr


    ^1/3还要*30、+平方,才算到4位,余数就8位了,那方法特别难算
作者: happy886rr    时间: 2017-7-8 21:27

回复 11# a2002
是啊,批处理溢出了。不过这个貌似用C语言才能实现最佳性能。脚本语言只能满足一般精度,但C语言可以做任意精度的高精度计算。
作者: a2002    时间: 2017-7-8 22:44

回复 12# happy886rr


    不过return可以是小数吗?(我C语言渣de一B)
作者: 523066680    时间: 2017-7-8 23:16

本帖最后由 523066680 于 2017-7-8 23:22 编辑

回复 13# a2002

如果自定义函数声明类型是 float/double, 就可以是浮点数
返回值要求是整数的,只有 main 这样的函数。

不过这没有关系,不管是浮点数还是整数,在底层,一切都是数字。浮点数就是有个单元存储了小数点所在的位置。

推荐 《Linux C编程一站式学习》,非常适合查阅和练习。有在线版(地址忘了。
作者: a2002    时间: 2017-7-9 07:52

回复 14# 523066680


    还有这个int main()类型可以改吗?
作者: 523066680    时间: 2017-7-9 10:41

本帖最后由 523066680 于 2017-7-9 11:09 编辑

当然是整数(有时也可以是void,看编译器实现),因为你的系统不滋瓷其他类型。
float main() 刚才试过了,编译可以通过,但系统得到的是整数。
作者: a2002    时间: 2017-7-9 11:55

回复 16# 523066680


    对,这个我也试过,小数变成整数了
作者: happy886rr    时间: 2017-7-9 20:15

本帖最后由 happy886rr 于 2017-7-9 20:16 编辑

回复 13# a2002

main为何要返回浮点数,main不需要返回什么小数的。你在其他函数里返回小数就行。main返回的是errorlevel值,因此只能是整数。而且这个值最好是0到255之间的值。以便与windows的errorlevel对接。




欢迎光临 批处理之家 (http://bbs.bathome.net/) Powered by Discuz! 7.2