Project1

标题: 【算法分享】如何利用纯事件进行开方 [打印本页]

作者: 白龙闲情    时间: 2020-5-20 01:35
标题: 【算法分享】如何利用纯事件进行开方
    之前有人问到RM没有开方功能,虽然我觉得这个功能没有也无所谓,但偶尔可能还是会用到的。再加上我也挺感兴趣,那就设计一个用纯事件开方的算法吧。虽然我知道这方法肯定有前人做过,不过是以自己的方法重现一下而已。
     首先根据扔鸡蛋模型,要想知道哪一层扔的鸡蛋会碎,就要一层层去试。要想知道Y是哪个X的平方,就将X代入1,2,3,4....不停相乘直到找到那个数就可以了。这是理论基础。
     这时候就会有小朋友问了,你这X代入的都是整数,怎么能准确找到呢!
     RM是没有小数的啊哈哈哈。RM的变量输入上限是99999999,那么求根的话只需要试10000次就够了,就这样我们获得了一个算法雏形——

     而且这么简单的数数算法计算机也能一瞬间算出来,人类的科技真是伟大。
     肯定会有人觉得这方法不是蠢到爆炸,要是我做ACT时一直并行处理的话不卡得要死!
     没错,接下来就是重点,既算法的优化。使用二分法的话,因为99999999小于2的二十七次方,即可保证最多只需要进行27次循环就能求得其整数根。
     不过RM虽然输入只能8位,但其实输出变量理论可以到达255位,有需要你可以根据自己的变量上限进行调整,这里只用八位数作说明示范。
     原理很简单,先从2的14次方16384开始求根,如果高于2048的平方,则将根值上升到【2的11次方加2的10次方】,否则降至【2的11次方减2的10次方】。每一次增减的值都是上一个增加值的一半,如此循环到2的0次方,即1的时候,就是最近似的整数解了。
     之所以使用2的平方数列而不是10000/2是因为RM的计算结果会忽略小数点,所以整除最好。

     这样一来,优化算法就完成了。当然在现代计算机强大的算力面前几乎没有区别。
     这时候又有人会问,我真的想要求小数怎么办,你给我精确到小数点后一位行不行。当然可以,虽然RM不能显示小数,但值还是能求出来的,但是前提是你一开始用来求根的值要在一开始乘以一百,即10的二次方。同理要精确到小数点后两位需要乘以一万,三位要乘以一百万。在设置一开始求根的值时也要加上精确位数数量的零。

     看明白之后,设计开三次方以上的逻辑只不过这循环多乘几次根而已。因为这个算法只用到基础功能,所以也适用于之前版本的RM。
     那么这次的纯事件算法分享就到这里结束了。
作者: chanszeman1018    时间: 2020-5-20 07:16
提示: 作者被禁止或删除 内容自动屏蔽
作者: if216    时间: 2020-5-20 08:15
我有点惊呆了。
应该是,Math.sqrt(x),没试
作者: 天空娃娃    时间: 2020-5-20 12:40
我正苦恼怎么用坐标做圆形的AOE,结果怎么开方出来,不过这个方法有点复杂吼
作者: 白龙闲情    时间: 2020-5-20 13:08
天空娃娃 发表于 2020-5-20 12:40
我正苦恼怎么用坐标做圆形的AOE,结果怎么开方出来,不过这个方法有点复杂吼 ...

你如果用代码的话其实很简洁。如果使用事件的话,建议你不开方,直接将半径乘以半径作为对比参数就好。即r的平方=M=ΔX的平方+ΔY的平方
作者: Zeldashu    时间: 2020-5-20 23:37
我数学不好,这个算法一般能应用在什么东西上?
作者: 鼠曲草    时间: 2020-9-1 20:16
这直接牛顿法不行么。。把牛顿法迭代公式的除换成整除就可以了




欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1