危险的浮点数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 ...
随机推荐
- vim中文手册
http://vimcdoc.sourceforge.net/doc/help.html
- Python一个简单的数据库类封装
#encoding:utf-8 #name:mod_db.py '''使用方法:1.在主程序中先实例化DB Mysql数据库操作类. 2.使用方法:db=database() db.fet ...
- Eclipse------新建文件时没有JSP File解决方法
1.为没有web选项的eclipse添加web and JavaEE插件 .在Eclipse中菜单help选项中选择install new software选项 .在work with 栏中输入 Ju ...
- vue中使用mockjs
第一步安装mockjs:npm i mockjs -S 在src目录下新建mock文件夹,文件夹添加test.js test.js内容如下: import Mock from 'mockjs'; co ...
- linux 停止对某个端口的监听
1.通过"netstat -anp" 来查看哪些端口被打开. 2.关掉对应的应用程序,则端口就自然关闭了,如:"kill -9 PID" (PID:进程号)
- Android应用程序的结构
1.src目录 存放该项目的源代码 2.gen目录 该目录文件是ADT自动生成的,并不需要认为地去修改 3.Android2.1 该目录存放的是该项目支持的JAR包,同时还包含项目打包时需要的META ...
- Nginx 72万连接性能测试(一)
转自:http://my.oschina.net/chenzhuo/blog/150200?p=2#comments 根据系统内存64G估算单台tengine做反向代理最高支持72万连接.为了验证达到 ...
- 用Python编写一个简单的Http Server
用Python编写一个简单的Http Server Python内置了支持HTTP协议的模块,我们可以用来开发单机版功能较少的Web服务器.Python支持该功能的实现模块是BaseFTTPServe ...
- PHP 搜索分词实现代码
<?php /** * @author: xiaojiang 2014-01-08 * php 建立分词树 * */ class Tree{ public $w = ''; public $su ...
- 禁用Visual Studio 2013的Browser Link功能 -调试不断请求http://localhost:6154/c4ad1c693ebf428283832eaa827f9c6e/arterySignalR/poll?transport=longPolling...
关于禁用查到的解决: 作者:donny945 https://my.oschina.net/ind/blog/359003 今天浏览器调试代码的时候,一直出现以下的请求,导致需要看的请求都被淹没了,之 ...