小心POW——一次OI刷题心得
一如既往的每周OJ两题时间,不过这一周有点不太愉快。
题面就不贴出来了,不过是一个数值范围在1e18以内,需要同时用到取对数和求幂的题。
用了常规的写法,CPP直接用了cmath库里的**log()和pow()**方法来求值。发现前五个数值范围在1e6内的成功AC,但是后五个1e18的就挂掉了。
于是全局int改用long long,**log()也改成了log10()**,问题依旧。
从晚上十一点反复改到凌晨四点,加上强制类型转换依旧无果,最终心态崩了。昨天一整个白天我都没上线,原因就在这(哭到天亮,然后睡了个不省人事)。
后来痛定思痛,把所有除了取对数以外涉及到浮点数的都手写成了整型模式,终于过了。罪魁祸首也终于浮出水面:**pow()**。
在cmath库里,**pow()**是基于浮点数运算的,返回值转回int时必然会有精度损失。
尝试在OJ上复现,但是因为自己想到的数字太小都没成成功,而且因为黑箱我也看不到输出结果。
查了一圈,最后在CSDN上发现了类似的情形:链接
最后得出了惨痛教训:整型慎用**pow()**。
实际上是慎用强制转换
从此,我的轮子库里又多了一个用long long重写的**pow()**方法。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 LoveCany在这!
评论