首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

高精确度的加法!(有难度)解决方案

2012-02-12 
高精确度的加法!!(有难度)精确的加法运算:1)写一个函数,实现两个“数”的加法,并将结果作为函数返回值返回。

高精确度的加法!!(有难度)
精确的加法运算:
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

我觉得应该对"底"做些限制
比如"底"只可以为素数

热点排行