- 浏览: 37188 次
- 性别:
- 来自: 上海
最新评论
一浮点数的知识
1.首先浮点数不用补码表示,只有int型才用补码表示。
2.计算机能精确表示的数值是有限的,离散的,而现实中的实数是连续的,这就必然有精度的要求。二进制的小数更糟糕,能精确表示的更少。
例如:
0.1D,表示成二进制的时候是循环的
0.0 0011 0011 0011......B
根据IEEE标准754:
32位的float类型有效位为23位。前面还有个隐含位。
所以float类型最多的有效位:24位(这个位是bit,是对2进制来说的)。
0.1d
在内存中的表示为:
0 01111011 10011001100110011001101B
第一位为符号位,
接下来8位为指数:实际指数+2^n-1=-4+127=123=01111011
接下来是23位有效位,前面还隐含一个有效位1.
而这个数
0 01111011 10011001100110011001101B
转化为10进制为:
0.100000001D
有0.000000001D的误差。
对于不同的数,误差补一样,可能在第7位,可能在第8位,第9位。但是能保证在小数点后面的六位是准确的。
http://cprogramsjzu.blog.sohu.com/81276949.html。
象fprintf函数输出float类型的时候,一般只输出小数点后面六位。
至于二进制的24位有效位,对应10进制的多少有效位,我不知道怎样计算,我看网上的方法都是错的。
二.浮点数的比较
1.浮点数精确比较
现在我们知道在计算机内浮点数本身是可以精确比较的。但是大部分实数不能精确的转化为计算机内部的浮点数(基本都是近似值)。
浮点数运算还是要用10进制浮点数来避免误差。
1.软件方法,据说java可以。我没用过。
2.硬件。传说IBM会生产进行10进制浮点运算的芯片。
所以根据已经了解到的知识,想把现实中的数,映射到计算机中进行比较,是不可能的,因为可能有N个实数对应于计算机中的一个数。
有意义的比较应该是带单位的数据在误差范围(这个误差根据需要设置)内的比较。
例如:身高,单位为厘米的时候,精确到小数点后面两位:
1.751cm我们认为等于1.75cm。
网上很多地方写浮点数比较的时候,会这样写:
fabs(A-B) < epsilon
一般将epsilon定义为:0.000001D
浮点数跟定点数比较是不对的。除非有现实的意义。
凭什么相差位epsilon就表示相等阿。大量不等的数据,这样判断都相等了。
除非限定输入,例如都是float类型,最小为:
#define FLT_MIN 1.1754943508222875E-38F
f1-f2 <FLT_MIN 则表示相等,这个还象话。
2.有现实意义的误差范围内的比较怎么写?
如果给定一个误差范围,在这个误差范围内则表示这两个数相等,应该怎么写?
我觉得得看需求。
三. 一个有趣的例子
原因看这个:
http://xenyinzen.wikidot.com/reship:080123-28
总结下来就是cpu内的精度比double都高。第一个程序:计算完a,a的值返回内存,被转化为64的double精度丢失。而b计算完之后,不返回内存大概精度80位左右,跟a比较。所以不等。
第二个都返回内存了。
http://www.cnblogs.com/diylab/archive/2011/01/10/1562407.html
http://cprogramsjzu.blog.sohu.com/81276949.html
http://topic.csdn.net/u/20070926/20/dee5a142-af94-4193-8752-3bf1ed12df28.html
http://blog.csdn.net/happy__888/article/details/289373
http://blog.vckbase.com/bruceteen/archive/2006/01/20/17193.html
http://www.cnblogs.com/FlyingBread/archive/2009/02/15/660206.html
http://zh.wikipedia.org/wiki/IEEE_754
http://www.cygnus-software.com/papers/comparingfloats/comparingfloats.htm
http://blog.vckbase.com/bruceteen/articles/240.html
http://www.cnblogs.com/bossin/archive/2007/04/08/704567.html
http://rangercyh.blog.51cto.com/1444712/405375
1.首先浮点数不用补码表示,只有int型才用补码表示。
2.计算机能精确表示的数值是有限的,离散的,而现实中的实数是连续的,这就必然有精度的要求。二进制的小数更糟糕,能精确表示的更少。
例如:
0.1D,表示成二进制的时候是循环的
0.0 0011 0011 0011......B
根据IEEE标准754:
32位的float类型有效位为23位。前面还有个隐含位。
所以float类型最多的有效位:24位(这个位是bit,是对2进制来说的)。
0.1d
在内存中的表示为:
0 01111011 10011001100110011001101B
第一位为符号位,
接下来8位为指数:实际指数+2^n-1=-4+127=123=01111011
接下来是23位有效位,前面还隐含一个有效位1.
而这个数
0 01111011 10011001100110011001101B
转化为10进制为:
0.100000001D
有0.000000001D的误差。
对于不同的数,误差补一样,可能在第7位,可能在第8位,第9位。但是能保证在小数点后面的六位是准确的。
http://cprogramsjzu.blog.sohu.com/81276949.html。
象fprintf函数输出float类型的时候,一般只输出小数点后面六位。
至于二进制的24位有效位,对应10进制的多少有效位,我不知道怎样计算,我看网上的方法都是错的。
二.浮点数的比较
1.浮点数精确比较
现在我们知道在计算机内浮点数本身是可以精确比较的。但是大部分实数不能精确的转化为计算机内部的浮点数(基本都是近似值)。
浮点数运算还是要用10进制浮点数来避免误差。
1.软件方法,据说java可以。我没用过。
2.硬件。传说IBM会生产进行10进制浮点运算的芯片。
所以根据已经了解到的知识,想把现实中的数,映射到计算机中进行比较,是不可能的,因为可能有N个实数对应于计算机中的一个数。
有意义的比较应该是带单位的数据在误差范围(这个误差根据需要设置)内的比较。
例如:身高,单位为厘米的时候,精确到小数点后面两位:
1.751cm我们认为等于1.75cm。
网上很多地方写浮点数比较的时候,会这样写:
fabs(A-B) < epsilon
一般将epsilon定义为:0.000001D
浮点数跟定点数比较是不对的。除非有现实的意义。
凭什么相差位epsilon就表示相等阿。大量不等的数据,这样判断都相等了。
除非限定输入,例如都是float类型,最小为:
#define FLT_MIN 1.1754943508222875E-38F
f1-f2 <FLT_MIN 则表示相等,这个还象话。
2.有现实意义的误差范围内的比较怎么写?
如果给定一个误差范围,在这个误差范围内则表示这两个数相等,应该怎么写?
我觉得得看需求。
三. 一个有趣的例子
/* -------------a.c------------------ */ #include <stdio.h> double f(int x) { return 1.0 / x ; } void main() { double a , b; int i ; a = f(10) ; b = f(10) ; i = a == b ; printf( "%d\n" , i ) ; } /*---------------- b.c ----------------------*/ #include <stdio.h> double f(int x) { return 1.0 / x ; } void main() { double a , b , c; int i ; a = f(10) ; b = f(10) ; c = f(10) ; i = a == b ; printf( "%d\n" , i ) ; } 前一个结果为0,后一个为1.
原因看这个:
http://xenyinzen.wikidot.com/reship:080123-28
总结下来就是cpu内的精度比double都高。第一个程序:计算完a,a的值返回内存,被转化为64的double精度丢失。而b计算完之后,不返回内存大概精度80位左右,跟a比较。所以不等。
第二个都返回内存了。
http://www.cnblogs.com/diylab/archive/2011/01/10/1562407.html
http://cprogramsjzu.blog.sohu.com/81276949.html
http://topic.csdn.net/u/20070926/20/dee5a142-af94-4193-8752-3bf1ed12df28.html
http://blog.csdn.net/happy__888/article/details/289373
http://blog.vckbase.com/bruceteen/archive/2006/01/20/17193.html
http://www.cnblogs.com/FlyingBread/archive/2009/02/15/660206.html
http://zh.wikipedia.org/wiki/IEEE_754
http://www.cygnus-software.com/papers/comparingfloats/comparingfloats.htm
http://blog.vckbase.com/bruceteen/articles/240.html
http://www.cnblogs.com/bossin/archive/2007/04/08/704567.html
http://rangercyh.blog.51cto.com/1444712/405375
发表评论
-
指针 多维数组
2012-06-05 16:12 664这篇文章写的很好 http://www.cnblogs.com ... -
pImp
2011-11-08 17:24 778http://www.cnblogs.com/JulyZhan ... -
关于构造函数,析构函数,explicit等内容
2011-11-01 17:04 1164一.编译器会为我们做什 ... -
C语言标准
2011-10-21 12:11 11881.K&R C 1978年,丹尼斯·里奇(Dennis ... -
对话框工厂
2011-10-14 18:00 6331.对于工厂我的理解: 良好的封装性。使用和创建,初始化分开。 ... -
函数指针实现回掉函数
2011-10-14 17:47 927用法: 头文件中声明: DECL_LINK( Paintin ... -
typedef和指针结合
2011-10-14 17:42 7681. typedef (int *) pInt; 2.type ... -
const的理解和应用
2011-10-14 16:52 1272const的理解和应用 一.理解 const是一种语义上的约束 ... -
空指针的判断
2011-10-11 17:43 882请看NULL的定义: #if !defined(__cp ... -
GUN C 和 ANSI C的几个区别
2011-10-11 10:52 1041http://hi.baidu.com/deep_pro/bl ... -
关于字符串倒转
2011-10-10 20:25 756有纯倒转,也有按单词为单位的。想做个总结 #inclu ... -
C数组和指针的区别
2011-10-10 19:25 685看《C专家编程》总结的的。 首先是个经典的例子: 一个文件定义 ... -
不用中间变量交换数据
2011-10-10 14:42 629那种加加减减的方法其实不对。因为缩小了数据范围。 a1=a1+ ... -
C++模板
2011-10-08 15:52 602template是关键字,template ... -
Quick Sort(快速排序)
2011-10-08 11:20 636Quick Sort算法描述如下: 假设S代表将被处理的序列 ... -
约瑟夫环的解答
2011-10-07 22:48 594http://blog.csdn.net/kittyjie/a ... -
Linux判断大小尾数(big-endian,little-endian)的方法
2011-10-07 22:12 1477static union { char c[4]; u ... -
c++基本文件操作
2011-09-30 00:28 750#include<iostream> #incl ... -
关于文件操作的头文件,类
2011-09-27 14:11 1065C++ 可以看这个 http://www.cplusplus. ... -
关于回车,换行,EOF
2011-09-26 17:41 2730回车换行: http://www.cnblogs.com/fa ...
相关推荐
浮点数比较错误
消除浮点数比较错误
浮点数比较大小.c
S7-200SMART_浮点数比较库文件
SMART库_精确浮点数比较real compare.smartlib.rar
本篇文章主要介绍了php浮点数比较方法,具有很好的参考价值。下面跟着小编一起来看下吧
近似:近似浮点数相等比较和断言
原来一直感觉单片机传送浮点数比较费劲,最近好好弄弄,其实没有那么复杂,不用了解浮点数是怎么存储的,知道占用4个字节就可以了!
浮点比较比较浮点数的功能。 计算机中的数字在内部用二进制表示,并且有些浮点数(例如0.1)没有用二进制精确表示。 如果没有精确的二进制表示形式,则该值将四舍五入到最接近的二进制表示形式,这将导致某些浮点数...
单精度浮点数,双精度浮点数,浮点数是属于有理数中某特定子集的数的数字表示,在计算机中用以近似表示任意某个实数。
单片机浮点数设计 单片机浮点数设计 单片机浮点数设计
Golang浮点数比较和运算会出现误差。 浮点数储存至内存中时,2的-1、-2……-n次方不能精确的表示小数部分,所以再把这个数从地址中取出来进行计算就出现了偏差。 package main import ( errors fmt github....
有些C语言书上说float型的有效位数是6~7位,为什么不是6位或者7位?而是一个变化的6~7位? 浮点数在内存中是如何存放的? float浮点数要比同为4... 如何才能精确比较浮点数真实的大小? 看完本文档,你将会得到答案!
浮点数整数转换工具,用于浮点数与整数之间相互转换
labview下实现16进制转换浮点数。
浮点数结构详细解释,数值计算指南中关于浮点数的一点解释
本文档简介了TMS320C3x浮点数简介、IEEE754的32位转VC33的32位浮点数算法、IEEE754的64位浮点数转VC33的40位浮点数算法;给相关TI的DSP开发工程师提供开发参考。
C语言浮点数转字符串
单片机在通信中,浮点数的处理往往容易出错,本代码解决单片机通信时的浮点数据转换处理,包括浮点数转换成char ,和char转成float类型