找回密码
 立即注册
搜索
热搜: 活动 交友
查看: 47|回复: 2

从整数高精度运算到浮点高精度运算

[复制链接]

38

主题

106

回帖

3867

积分

超级版主

积分
3867
发表于 昨天 11:31 | 显示全部楼层 |阅读模式
本帖最后由 liuyi 于 3-25-2026 18:05 编辑

RT的中B课堂Lesson3是高精度计算,同学们的程序可以轻松进行指定位数的高精度加法和乘法。

课后作业是:能不能基于int的高精度计算,做一套float的高精度计算程序?

这是课堂的ppt
很多同学在做这个作业的时候,遇到了一些细节问题,来找我讨论。实际上呢,这个float高精度计算,还是需要设计。
所以,就来论坛上和大家详细讨论。

首先,课堂的乘法函数,是基于加法函数的。所以,乘法里所有的加法,都坚决调用加法函数,绝不另外搞一套。
那么,新写的float运算,是基于int运算的,其int部分也坚决调用已有函数,也绝不另外搞一套。

按照工程设计,分两步走。数据格式处理和计算。

先完成计算
计算部分的代码,仅增加了一个函数用来小数点对齐

对齐函数point_align就不用贴代码了。从上面的调用也可以看到,输入是n1List, n1Point, n2List, n2Point,输出是n1Point, n2Point,函数代码非常简单。加法需要小数点对齐,乘法不需要,实际也是乘法更简单。

可以看到,1.5和1.25在输入的时候如图。
输出部分:
150 2是向1.25对齐后的1.5
125 2就是1.25
275 2是1.5+1.25=2.75
18750 4是1.5*1.25=1.875

第一步计算,完成
然后开始格式部分

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×

38

主题

106

回帖

3867

积分

超级版主

积分
3867
 楼主| 发表于 昨天 19:24 | 显示全部楼层
本帖最后由 liuyi 于 3-25-2026 19:28 编辑

第二步,格式部分

写程序之前,先要有设计。
原来的设计,无论加法add函数还是乘法mtp函数,输入和输出,是一样的格式。
所以,进行比如f1*(f2+f3)+f4的计算,就可以写作:
s = f2.add(f3).mtp(f1).add(f4)
无论f1,f2,f3,f4还是计算结果s,都是一个list
那么对于浮点数,现在的设计是 int, point有两项,也就是由一个整数和小数点位置组成。
计算函数的输入输出,都应该包括int和point。
这种情况,最好使用面向对象来完成。

计算函数,比如加法和乘法,这里参考魔A课程里的分数Fraction的设计

也就是说,让加法和乘法都成为Number的方法函数,然后用n1.add(n2).mtp(n3)这样的方式来计算(n1+n2)*n3


这个程序,只有加法(乘法肯定留给读者你自己,因为高精度乘法比加法还要简单)。
运行结果如下:


看上去现在是能计算了,能输出了。但还有一个问题就是:输入格式没解决。
继续往下看

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×

38

主题

106

回帖

3867

积分

超级版主

积分
3867
 楼主| 发表于 昨天 19:50 | 显示全部楼层
本帖最后由 liuyi 于 3-25-2026 19:58 编辑

输入格式Number化


真的只要修改这一个函数就可以
如何使用呢?更方便

测试代码长这样
运行结果如下

加法彻底搞定了!请你自己搞定乘法吧!

然后,我们做一件事:初级班的“二分迭代开平方根”,是不是可以高精度了?


这里面的几个计算,都可以方便解决,比如 / 2 其实就是 * 0.5,至于10 ** point,那更容易,list.insert(0, 0)即可
更需要注意的是:不仅加法乘法需要写个函数来调用,比较两个数的大小,也需要写函数。


如果一直到这里,你程序都进展顺利,那么,就写好乘法,做个“超高精度开平方根”程序吧!
加油!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|RealDevClub ( 沪ICP备2024093864号-1 )

GMT+8, 3-26-2026 03:59 , Processed in 0.067325 second(s), 23 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表