C++ code:浮点数的比较(Floating-Pointing Number Comparison)
浮点数可以进行比较,但是浮点数由于表示精度在不同浮点数类型中的差异,所以会被误用。例如:
#include <iostream>
using namespace std; int main()
{
float f1 = 7.123456789;
float f2 = 7.132456875;
cout << (f1 != f2 ? "not same\n" : "same\n"); float g = 1.0 / 3.0;
double d = 1.0 / 3.0;
cout << (g==d ? "same\n" : "not same\n"); system("pause");
return ;
}

当你满怀信心读完程序后,想象出的运行结果却与真实的运行结果不同的时候,你会如何想?
首先,由于十进制单精度浮点数的有效位数为7,两个前7位相等而后面不同的数有可能在计算机中表示为同一个浮点数,因而判断两数不等而失败!
为了避免这类问题,请统一使用double,而不要混用不同精度的浮点。对于C++来说,float已是昔日黄花,除了过渡一些C程序,在新编的程序中实在没有太大用处,因为double完全包含了它,而且浮点运算在内部都是先化为double进行的,使用float还必须付出转换回来的时间开销,因此混进float只会添乱!!
另外,由于浮点数在计算机内实际上是一个近似表示,在手工计算看来为正确的结果,在计算机中运算未必能得出正确的结果。例如:

因为浮点数的构成原理,决定了十进制数在转换为内部浮点数时,由无穷尾数而带来的不精确性。上面程序中d1和d2变量的值本应相等,却在计算机内部为不等。
所以,我们还得到另外一个重要的经验:使用浮点数进行相等(==)和不等(!=)比较的操作通常是有问题的。浮点数的相等比较,一般总是使用两者相减的值是否落在0的邻域中来判断的。上面程序中第13行语句所示的邻域比较技术,请多多体会,进而模仿!
C++ code:浮点数的比较(Floating-Pointing Number Comparison)的更多相关文章
- matlab里textread出现错误“Trouble reading floating point number from file (row 1, field 1)”
matlab里textread出现错误“Trouble reading floating point number from file (row 1, field 1)” 解决办法:traindata ...
- python中使用redis
准备 安装redis服务 点击查看Ubuntu中安装Redis. 安装依赖包 pip install redis 使用 import redis 创建连接 1.普通连接: conn = redis.R ...
- Redis常用操作-------Hash(哈希表)
1.HDEL key field [field ...] 删除哈希表 key 中的一个或多个指定域,不存在的域将被忽略. 在Redis2.4以下的版本里, HDEL 每次只能删除单个域,如果你需要在一 ...
- Redis常用操作-----字符串
1.APPEND key value 如果 key 已经存在并且是一个字符串, APPEND 命令将 value 追加到 key 原来的值的末尾. 如果 key 不存在, APPEND 就简单地将给定 ...
- Jedis操作Redis--Hash类型
/** * Hash(哈希表) * HDEL,HEXISTS,HGET,HGETALL,HINCRBY,HINCRBYFLOAT,HKEYS,HLEN,HMGET,HMSET, HSET,HSETNX ...
- redis命令之 ----Hash(哈希表)
HDEL HDEL key field [field ...] 删除哈希表 key 中的一个或多个指定域,不存在的域将被忽略. HEXISTS HEXISTS key field 查看哈希表 key ...
- redis命令之 ----String(字符串)
SET SET key value [EX seconds] [PX milliseconds] [NX|XX] 将字符串值 value 关联到 key . 如果 key 已经持有其他值, SET 就 ...
- redis-Hash(哈希表)
Redis hash 是一个string类型的field和value的映射表,它的添加.删除操作都是O(1)(平均).hash特别适用于存储对象,将一个对象存储在hash类型中会占用更少的内存,并且可 ...
- Java中浮点数的基础知识
偶然查看Math.round的JDK public static int round(float a) { if (a != 0x1.fffffep-2f) // greatest float val ...
随机推荐
- jdk8的特性stream().map()
转: https://blog.csdn.net/sanchan/article/details/70753645 java8的optional的使用: http://www.jdon.com/ide ...
- idea中gitlab新创建分支查找不到的原因
问题: 很多人说是这样解决: https://blog.csdn.net/rodulf/article/details/51536532 然后对于我来说没用............ 这里先说下如何从m ...
- Scala进阶之路-Spark底层通信小案例
Scala进阶之路-Spark底层通信小案例 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Spark Master和worker通信过程简介 1>.Worker会向ma ...
- python 压缩文件为zip后删除原文件
压缩.log 文件为zip后删除原文件 需要注意:本人作为小白,该脚本需要和.log在一起,后面有时间需要改正. #!/usr/local/python/bin/python #-*-coding=u ...
- Java语法总结--Java集合类
这一节我们来总结一下Java集合类. Java集合总结 继承与Collection接口的–List接口 List接口本身的特点 常见的继承List接口的实用类 实用类对比 继承与Collection接 ...
- JAVA记录-异常基本概念
1.异常分类 2.错误和异常的区别 3.try-catch-xxx处理方式 Java Exception:1.Error 2.Runtime Exception 运行时异常3.Exception 4. ...
- 《Two Dozen Short Lessons in Haskell》所有习题的索引
<Two Dozen Short Lessons in Haskell>(Copyright © 1995, 1996, 1997 by Rex Page,有人翻译为Haskell二十四学 ...
- require.js Javascript模块化
浏览器端的模块,不能采用"同步加载"(synchronous),只能采用"异步加载"(asynchronous).这就是AMD规范诞生的背景. AMD是&quo ...
- u-boot移植(二)---修改前工作:代码流程分析1
一.代码执行总体流程图 1.1 代码路径 U-boot.lds (arch\arm\cpu) vectors.S (arch\arm\lib) start.S (arch\arm\cpu\arm920 ...
- postman变量的使用和设置
之前只是使用postman做接口管理——将各个项目使用到的接口分类管理起来,用的时候手动改参数调用.这次项目连着跑三个接口,需要用到前一个接口的参数,还来回切平台,真的很麻烦,所以就搜了一下有什么便利 ...