高精度计算问题中使用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
- 高精度计算问题中使用double失败的原因
- Java中Double的高精度问题及bigdecimal解决方式
- long double 高精度数据的使用
- 计算高精度指数运算中遇到的问题
- double 计算精度的问题
- java中double计算精度问题
- OpenCV中使用imread函数读取图片失败的原因
- java double 计算出错的问题
- Java 中double变量的精度计算
- java中Double数值的计算
- 结构中使用double变量的奇怪问题
- DLL中使用FindResource失败的问题
- java中float/double浮点数的计算失精度问题
- 解决BeanShell中double或float计算不准确的问题
- java中float/double浮点数的计算失精度问题
- Java中浮点型数据Float和Double进行精确计算的问题
- Java中 float、double使用注意问题
- java中double、float类型计算精度丢失问题
- Android 闹钟 开发过程记录(一)
- 16道嵌入式C语言面试题(经典)
- 52. N-Queens II Leetcode Python
- solr(一)配置文件详解与整合zookeeper集群
- 计算时间复杂度 -- 写程序需瞻前顾后
- 高精度计算问题中使用double失败的原因
- Xcode 升級後,常常遇到的遇到的警告、錯誤,解決方法
- A. A and B and Chess
- 32位/64位机上常用数据类型字节数(C语言)
- Object-C中对时间的处理
- 【学习笔记】"ListView滑动删除 ,仿腾讯QQ"(三)
- iOS XCode快捷键使用
- Arduino 在amd64 win8.1上驱动安装失败的解决办法
- java 代码块