高精确度的加法!!(有难度)
精确的加法运算:
1)写一个函数,实现两个“数”的加法,并将结果作为函数返回值返回。此函数
目的是获得精确的结果(例如,为了避免十进制表达1/3时会出现无限循环小数,
应该把1/3表达为以3为底的0.1)。
2)写一个‘main()’主函数,用来执行各种测试用例,主函数的功能包括,打印
输出两个加数,以及计算后的结果输出。并且需要注释您所选择的测试用例。
3)解释您的函数的局限性。
加数定义如下:
1)有底数(即进制数)(例如,‘2’代表二进制,‘10’代表十进制)
2)一组连续的字符,代表基于1)所定义的底数的值。例如“1001001.11001”或
者“19384.5432”
3)由整数部分和可选的小数部分组成。
例如,您的程序可以这样执行:
$ ./a.out
调用方式: ./a.out <加数 1> <加数 1 的底> <加数 2> <加数 2的底>
$ ./a.out 12.2 3 31.3 4
17.5 12
[解决办法]
我认为boost中的rational正适合你这样的需求。不妨调查参考下。
[解决办法]
我觉得把它用做float的无损计算很合适。方案完整。效率高。应该比较合适吧。
再配合马上就要成型的boost::unit。一套物理计算的完整方案就不远了。你看呢?
[解决办法]
将两个数的整数与小数部分分别计算;
1,整数部分转换成10进制整数;
2,小数部分转换成10进制的分数;
比如 123.321(4进制数),整数部分=(1*4+2)*4+3=27,小数部分=3/4+2/(4^2)+1/(4^3);
3,转换完毕后,先分别整数部分+整数部分,分数+分数;
两分数部分可以先求出所有分母的最小公倍数,然后转换成一个分数;
4,分数的分子/分母,得到的整数加到整数部分,分子%分母得到的为新的分数;
以最后得到的分数的分母为底,可以将结果转换成小数点后只有一个数的小数;
不过题目的限制太少;没有限定底的范围,当底很大时,输出是个问题。
比如底为99,则98怎么输出?
[解决办法]
我的想法也和尾巴一样的
其实就是用分数求结果的过程。 然后以公分母为底 然后再输出结果
底是99 的话 那么98 应该可以这样表示了吧 0.98 99
但是需要很高的效率的话,比较困难。
[解决办法]
类似我说那样的处理方法,是没有任何的精度损失的;
以 12.2 3 31.3 4 为例:
12.2 3==》整数部分=5,小数部分=2/3;
31.3 4==》整数部分=13,小数部分=3/4;
5+13=18;
2/3+3/4=17/12=1+5/12;
最终的整数部分为18+1;小数部分为5/12;
以12为底,最后的结果可表示为17.5
[解决办法]
一个简单的算法:
0) 设A={(ai, ra)|i=-m, k, }, B={(bi, rb)|i=-m, k}. ai, bi可以为零. ra, rb分别为A,B
的基数(底数)
1) 取C==A+B= {(ci, rc)|i=-m, n}, 其中rc=ra*rb 为C的基数.
2) A, B的整数部分转换为10进制数计算, 结果转换再转为rc进制, 并求得n和{ci|i=0, ...n}
3) 小数部分:
ci = ai*rb+ bi*ra; 其中i=-m,...-1;
其中2), 3)均可用浮点(如double)运算, 而不失精度.
数的输入输出表示:
A: a(m)_a(m-1)_a(m_2)_...._a(0).a(-1)_a(-2)_...a(-k), ra
其中a(m) 表示ra进制m位的系数, 用10进制数表示; ra也用10进制数表示; 显然a(m) <ra.
[解决办法]
刚刚打了个草稿算了下.可能效率不太高,但还是可以做.算法如下:
1:求两个数基数的最小公倍数m
2:从小数部分的最低位开始加起,当然是转换成m进制的小数相加.(小数部分转换较简单)
3:整数部分转换为m进制相加,别忘了把2中小数部分进位上来的也加进来.
最后结果为m进制的数.
[解决办法]
说几个看法:
1.以任意n为底的算术系统本身不存在难度,但是其表示方法是个问题,比如100进制,可以考虑表示为一个tuple.
(99,30,21)100 就是说,这个一百进制数的各位数字别是99,30,21。
2.以分数表示有其优越性,首先是绝对精确;第二可以适应进制转换,只要分母和分子分别转换就可以了,这样可以轻松转换到10进制下考虑。
3.最后,输出的表示,n/m可以表示为:m进制下的n*0.1(其中n和0.1都转换为m进制)。
4.如果要求进制数尽量小,就要考虑更多的问题,目前似乎无此需求。
5.问题尚未全部解决,因为输入输出可能超过long long的表示范围。
我觉得完整解决问题应该:
1.首先编写10进制任意大整数的加减乘除问题,比如写成一个类叫Integer。
2.增加任意进制的功能,主要是解决输入输出问题。
2.然后用分数做内部表示,解决上述问题。
[解决办法]
这种表示方法得到的数并不唯一
例如
12.21 3
同样可以表示为 12.7 9
我觉得应该对"底"做些限制
比如"底"只可以为素数