算法竞赛入门经典(第2版)习题3-12 浮点数 Floating-Point Numbers UVa11809

博主在解决UVa11809浮点数问题时遇到了挑战,经过多次尝试和分析,发现错误源自浮点数转整数的系统误差。通过建立换算公式组、尾数和阶码表,最终成功AC。关键在于正确处理浮点数转换,避免类似1.0000000*10^9变成999999999的误差。
摘要由CSDN通过智能技术生成

这题有点逼近我的智商上限了,看了好几遍才明白大概意思。编程的时候脑子里一直有点乱,卡了我将近一周,代码整体重写了三次。每次都可以实现样例,但是一直WA。

本来都打算跳过去了,但总是有点不甘心。

决定尝试最后一次:把所有可能情况的输入数据都算出来当做测试数据,最终发现WA是由于浮点数转换成整数时的系统误差导致的。

印象里书中样例曾经在浮点数转换整数时+0.5,我这里没有这样做

结果在某个测试样例中double 1.0000000*1000000000转换为整数的结果成了999999999,最终导致WA。

修改了这个bug后,顺利ac。

思路如下:

1.利用10^1=1.25*2^3逐级推算出1<=n<=10时10^n与2^m的换算公式组

2.推算出0<=M<=9各值时所有的十进制小数尾数,得到M表

3.推算出1<=E<=30各值时所有的2的十进制阶数,得到E表

4.读入s串并分割,把输入尾数存在double ap中,阶码存在int B中

5.利用第一步中求出的公式把10^int B转换为中转十进制浮点数double zz*(2^int E)其中1<=zz<2

6.计算出中转十进制浮点数zz* ap 结果存入 double apzz,其中0.5<=apzz<1,并修正E值

7.用apzz在M表中查询,得到M值

8.用E在E表中查询,得到E值


//#define LOCAL
//#define TESTING
#
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值