标题: 批处理计算根号(1-99) [打印本页]
作者: a2002 时间: 2017-7-8 12:07 标题: 批处理计算根号(1-99)
本帖最后由 a2002 于 2017-7-8 12:08 编辑
这是一个计算2次方根的程序(1到99以内的数),源码如下:- @echo off&setlocal enabledelayedexpansion
- set /p "a=数(1-99):"
- set /p "loop=保留的有效数字:"
- set s=0&set r=&set y=!a!
- :loop
- if "!loop!" equ "!_loop!" goto :ans
- set /a _loop+=1
- for /l %%a in (1,1,10) do (
- set /a t1=s*20*%%a+%%a*%%a
- if !t1! gtr !y! (
- set /a n=%%a-1,_s=s*20*n+n*n,y=y*100-_s*100
- set r=!r!!n!&set s=!r!
- if !y! equ 0 goto :ans
- goto :loop
- )
- )
- :ans
- echo 结果:!r:~0,1!.!r:~1!
- 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://www.bathome.net/) |
Powered by Discuz! 7.2 |