【思考题】无限循环小数化分数
mathcad吧
全部回复
仅看楼主
level 12
朱老剑客 楼主
在https://tieba.baidu.com/p/3259544775中,咱们探讨了任意有限小数化为分数的方法,百科了一下,对于无限循环小数(混循环、纯循环)也有方法可以化为分数。
前几天我特么犯神经质,关于“自定义函数”的事儿跟@LNSZDZG 扯了一大堆,当我做完了“MC吧档案”之后,才发现整个工作没必要搞得那么复杂,还希望LNS别生我的生气哈,有机会你来北京,我请你吃好吃的。:)
现在感觉“整理zpz老师讲稿”、“翻译国外电子书”“做科普课件”这三件事儿是需要专门来做的,而“丰富MC工程应用实例”和“积累自定义函数”这两件事儿还是需要群策群力更好,由个人或若干几个人来做,太不公平。
嗯,书归正传,
按照百科中方法:
http://baike.baidu.com/link?url=vxsMfgFCC1WiM0ZyIpFccYNWtZNwY8ebybHghzwCSIT0QUM2uZcEZ7cH7RiA_tgOYu6Ah6hqmlZOl9NLNXukya
只能有规律的单循环节小数进行处理,对于无规律的多循环节小数还是没有有效的方法。
比如说:
0.0{28},循环节为28,这种循环小数有方法化为分数,14/495;
而0.0{28}{56},循环节{28}和{56}的顺序无规律,形成如0.028565628282828565628……,这无规律的多循环节小数本身就可能是一个无理数(不知怎么证明……),无法化成分数。
本题尽管公式是已知的,但还是有难度的,需要将其编成一个独立的自定义函数,并给出验证。
2015年01月27日 03点01分 1
level 12
朱老剑客 楼主
这题有点儿难度,建议各位自己试试看。
前几天我学了一些在程序板里进行符号计算的方法,https://tieba.baidu.com/p/3546533249,但实际上这个方法的使用情况是受限制的,比如说符号计算对“字符串函数”不识别:
还有,我发现MC的mod、gcd、lcm函数是非常不稳定的,同样的运算形式,但有的可以得到结果,有的却无法计算:
在https://tieba.baidu.com/p/3259544775中,最后得到了一个confrac,fraction | simplify的组合,现在可以做成符号函数了。
而这个还没有解决处理循环小数的问题。
实在想不出怎么在MC中定义一个循环小数了,主要是循环节怎么表示出来,尤其是在混循环情况下,比如说0.001212121212……,其中“0.00”是不变的,“12”是循环节,但如果你直接跟MC说:0.00,它会当做0,同理,对于0.0011001100110……来说,可以认为循环节为“1100”,也可以认为是“0011”或者“0110”或者“1001”,都没问题,但是如果你跟MC说0011,它会认为是11。所以这里我用字符串来定义定义循环小数,并把不循环的部分和循环的部分分开输入。
如前所述,因为涉及到了“字符串函数”,我的这个处理循环小数的函数注定不能进行符号计算,因为MC的数值计算有17位有效数字精度限制,而且不能得到分数结果,因此我的这个答案注定不能一次完成“小数化为分数”的操作,而需要进行一次对结果的后处理。
还有一个问题,我们经常说的不循环小数,比如说0.123这样的,能不能认为也是循环小数的一个特殊情况呢?0.123=0.1230000000000……,在这里循环节就是“0”。如果是这样的话,那么这个问题才是真正的“任意小数化为分数的方法”。
嗯,有上面的种种限制,而且之前我从来不知道还有这些限制,编程的过程很虐心,不过程序挺简单的……
我的思路和百度百科的里介绍的一样,那个方法是假设0.99999999……就是1,其中“9”是循环节。当我们要用分数表示一个小数时,比如说0.125,最简单的思路就是125/1000,然后再约分,得到一个分数1/8。当处理循环小数时,就把“1”的相应循环小数形式作为分母,0.999999999……的循环节可以认为是“9”,也可以认为是“99”、“999”……,用循环小数的循环节和相应的“1”的循环节,得到纯循环小数,再除以循环开始时所处的位数,就成了混循环小数。0.9999999……是纯循环小数,除以100,0.009999999……,就成了混循环小数了。
以23.235827827827827827827……为例,循环节为“827”,处在小数点后第4位,因此它的分数形式就是:(23.235*999000+827)/999000:
这样下面的程序就比较容易理解了吧:
验算一下:
在这里一定要用“=”使XHfrac()出现显式解,否则G0/G1在符号运算时仍会遇“与字符串函数不兼容”的问题。
因为这个函数的思路是最原始的,没有用到连分式,也就没有连分式分解中引入的误差,因此它的处理结果也就最有保障:
2015年01月27日 13点01分 2
1