高精度计算问题中使用double失败的原因

来源:互联网 发布:记工时的软件 编辑:程序博客网 时间:2024/06/05 01:15

在比赛中经常可能接触到高精度计算的问题,高精度算法虽然不难,但是写起来总是比直接用麻烦,于是我当时想了各种方法偷懒,想避免这个问题,当时最先想到的就是利用浮点型float 和double的高精度特性来代替高精度算法。具体做法是先用一个double型变量ans来计算并表示结果,然后把结果输出时只显示ans的整数部分。

</pre><p>以上偷懒的方法有时确实能够侥幸成功,但是很多时候却是以失败告终,最后分析一下才发现失败的原因:</p><p>以以下程序为例说明:</p><p></p><p></p><pre name="code" class="cpp">#include <stdio.h>#include <math.h>long long ans1;double ans2;float ans3;int main(){    printf("2^56运算结果:\n");    ans1=pow(2,56);    ans2=pow(2,56);    ans3=pow(2,56);    printf("Integer: %lld\n",ans1);    printf("Double:  %.0lf\n",ans2);    printf("Float:   %.0f\n",ans3);    printf("\n2^57运算结果:\n");    ans1=pow(2,57);    ans2=pow(2,57);    ans3=pow(2,57);    printf("Integer: %lld\n",ans1);    printf("Double:  %.0lf\n",ans2);    printf("Float:   %.0f\n",ans3);    return 0;}
<span style="font-size:24px;">程序运行结果:</span>
</pre><pre name="code" class="cpp">2^56运算结果:Integer: 72057594037927936Double:  72057594037927936Float:   720575940379279362^57运算结果:Integer: 144115188075855872Double:  144115188075855870Float:   144115188075855870可以看到当运算数据大于2^56时,就会出现结果偏差。查询资料发现浮点数的运算本来就存在偏差,可能与机器内部存储运算方式有关。<span style="font-size:18px;">所以float和double并不具备高精度运算的特性</span>,希望后面跟我一样想到这种偷懒方法的同学另辟蹊径,去探索别的更高明的方法,不要在这里浪费宝贵的时间了。


0 0
原创粉丝点击