危险的浮点数float
今天写程序又以为我见鬼了!最后查出来发现原来又是浮点数搞的鬼!
情况大致是这样的,我想要测试向量运算的速度,所以要对一个浮点数向量进行求和运算,代码如下:
int vect_size=100000000;
vector<float> vect1(vect_size,0.1);
float sum=0;
for(int i=0;i<vect1.size();++i){
sum+=vect1[i];
}
printf("%f\n",sum);
10^8个0.1求和,地球人都知道结果应该是10^7,运行结果竟然是……2.097152*10^7
我了个擦!我读书少你也不能这么骗我啊!
当vect_size为10000时,运行结果为999.902893,说明错误是累加形成的,并非溢出之类的造成的。
注意我保留了小数点后这么多位,原因是在不同的电脑上运行,结果是相同的,即都会产生这么大的偏差。
如果我把float换成double,那么结果是没有问题的。
我猜想了一下原因:
float的精度有一定的上限,对于任何小数,float都只能是用一个最接近的数来表示,并不是完全一样的数,即float是不连续的。所以0.1在float中是不存在的,只存在0.100000001(举个例子~),而这个规则是float的定义造成的,并非编译器或运行环境决定的,所以在不同的电脑上运行结果相同。此外,double的精度更高,所以在1亿这个量级上还看不出误差。
是否真是这样,等有时间研究下float再说。
不过这么看,float真是蛮危险的,因为其反直觉,所以很有可能给程序造成一些意料之外的结果(就是我说的见鬼了)。
我上一次见鬼也是跟float有关,大致代码如下:
float f=0.1;
if(f==0.1){
printf("equal!");
}
当时还是用python写的,死活不通过……其实原因上面已经提到了。
float当真反直觉!代码中的不确定因素!
危险的浮点数float的更多相关文章
- Java浮点数float,bigdecimal和double精确计算的精度误差问题总结
(转)Java浮点数float,bigdecimal和double精确计算的精度误差问题总结 1.float整数计算误差 案例:会员积分字段采用float类型,导致计算会员积分时,7位整数的数据计算结 ...
- Relearning PHP (2) – php 的浮点数float
Relearning PHP (2) – php 的浮点数float 暂无评论 php有很多坑,但是并不妨碍他是最好的语言.其他语言对于浮点数处理同样有问题,这应该是个“共有坑”.不信可以用googl ...
- IEEE浮点数float、double的存储结构
众所周知,C的float.VB的Single都是32位浮点数变量类型(也叫单精度浮点数),C的double和VB的Double则都是64位的浮点数变量类型(也叫双精度浮点数).有些编译器还支持更屌的l ...
- delphi 浮点数float转换成十六进制字符串的方法(FloatToHex)
重新书写了float型转为十六进制的delphi程序 Function FloatToHex(Value: single): string; var l, i: integer; HexText,te ...
- 浮点数float累加误差解决方式总结
首先是float累加产生误差的原因,该部分转自:http://blog.csdn.net/zhrh0096/article/details/38589067 1. 浮点数IEEE 754表示方法 要 ...
- php浮点数(float)运算中转整形(int)问题
今天工作中遇见了一个浮点数转整形的问题,特此记录一下,防止以后再次踩坑. 实例: $f = 0.58; var_dump(intval($f * 100.0)); 也许你认为他会输出58,但是实际上他 ...
- C中的Float分析
C/C++中, 浮点数,float以及 double 在内存中是怎样存储的? 假如,我有32-bit 8bit 8bit 8bit 0 0 0 0 0 1 1 1 1 对于整形int,我们可以很快得出 ...
- java基本类型(数值范围):浮点的底层表示定义,float计算快一些
Java八种基本类型: 六种数字类型(四个整数型,两个浮点型), 一种字符类型, 一种布尔型. 具体如下 1.整数:包括int,short,byte,long 2.浮点型:float,double 3 ...
- 【Android 应用开发】Android开发技巧--Application, ListView排列,格式化浮点数,string.xml占位符,动态引用图片
一. Application用途 1. Application用途 创建Application时机 : Application在启动的时候会调用Application无参的构造方法创建实例; Appl ...
随机推荐
- 如何在xml中设置textview不可见
可见(visible)XML文件:android:visibility="visible"Java代码:view.setVisibility(View.VISIBLE);不可见(i ...
- css3-rem
http://www.w3cplus.com/css3/define-font-size-with-css3-rem https://mp.weixin.qq.com/s/DpLXJhfCHsgrbg ...
- Java显示指定类型的文件
文件作为存储数据的单元,会根据数据类型产生很多分类,也就是所谓的文件类型.在对数据文件进行操作时,常常需要根据不同的文件类型来作不同的处理.本实例实现的是读取文件夹指定类型的文件并显示到表格控件中.这 ...
- 5 -- Hibernate的基本用法 --4 1 创建Configuration对象
org.hibernate.cfg.Configuration实例代表了应用程序到SQL数据库的配置信息,Configuration对象提供了一个buildSessionFactory()方法,该方法 ...
- AE插件开发的一些总结
首先会遇到第一个问题,为什么输出的aex文件不在bin目录下,而在别的目录下.其实问题出在链接器的设置里.把这个改成自己想要的目录就OK 然后一些object的报错,直接把警告等级改成0就可以了.属性 ...
- 在iOS中使用icon font
博文转载至 http://www.cocoachina.com/industry/20131111/7327.html 在开发阿里数据iOS版客户端的时候,由于项目进度很紧,项目里的所有图标都是用最平 ...
- JSPatch实现原理详解
本文转载至 http://blog.cnbang.net/tech/2808/ JSPatch以小巧的体积做到了让JS调用/替换任意OC方法,让iOS APP具备热更新的能力,在实现 JSPatch ...
- HashTable、HashMap、ConcurrentHashMap、Collections.synchronizedMap()区别
Collections.synchronizedMap()和Hashtable一样,实现上在调用map所有方法时,都对整个map进行同步,而ConcurrentHashMap的实现却更加精细,它对Ha ...
- linux CentOS 7 安装 RabbitMQ 3.6.3, Erlang 19.0
1. 安装erlang 安装依赖环境 yum -y install make gcc gcc-c++ kernel-devel m4 ncurses-devel openssl-devel unixO ...
- 在MyEclipse(2015)中上传项目到github的步骤(很详细)
(图文)在MyEclipse(2015)中上传项目到github的步骤(很详细) git|smartGit使用详解 SmartGit使用教程