user-0 提问: [100分]浮点数比较大小(数字大小比较)

回复:
user: user-1
content: 因为double的精度比float的精度高 所以如果一个0.8是float的话，而float的精度是6位，所以这个0.8可能是0.8000004 也可能是0.8000002 而double的精度很高，远高于6位，所以double的0.8往往比float的0.8要小  所以要么你和0.8f比 要么全部都用double

user: user-2
content: http://bbs.csdn.net/topics/390676437

user: user-3
content: 这么看吧 0.8 转化为二进制 =》 0.8*2 =1.6   进1                                             0.6*2 =1.2  进1                                             现在剩下0.2了，不停乘2下去，是转不尽的，所有在内存中只能存储部分，以32位lfoat为例，它的尾数是23位，也就是最小2^-23次，如果比这个小，那么相等比较就不确定了。可以直接使用FLT_EPSILON，或者自己定义，由于log2大约是0.3, 所以可以很快算出，float是23位，十进制位数就是23*0.3=6.9最多7位，double是52位 52*0.3 最多16位

user: user-4
content: 楼主的问题其实很简单：就是 0.8f != 0.8 这个float 和 double 问题，就像10进制里面的 0.33333333 和 0.3333333333333333不相等一样。  而向 float 比较 0.8f == 0.8f 或 double 比较0.8 == 0.8 都是没问题的

user: user-5
content: 浮点数有精度问题，比较相等最好用两数的差值的绝对值是否小于某个很小的数（比如0.000001）来近似认为相等

user: user-6
content: 1、浮点数可以进行大小的比较，比如 if(m < 0.8) 这样就没错； 2、浮点数进行相等比较的话，需要考虑误差， if(m == 0.8)需要这样写： #define EPS 1e-6 if(((m - 0.8) > - EPS) && ((m - 0.8) < EPS)))  引用 楼主 u013163178 的回复:#include<stdio.h>  int main() { 		float m; 		scanf("%f",&m);/*请输入0.8*/ 		if(m <= 0.8) 				printf("YES\n"); 		else 				printf("NO\n"); /* m大于0.8 */ 		return 0; } 我的机器上运行结果是： NO  也就是说0.800000大于0.8， 我的问题是，机器是如果比较两个数的大小的？比如说它怎么判断 3 > 2，或者 0.3 > 0.2.

user: user-7
content: 楼主，最近我刚深刻 的研究了IEEE754标准。你要看这个标准，0.8是没法准确表示的。这个可能是编译器对0.8和你的scanf函数对0.8转成float格式的时候，转换的并不是相同的4byte float值

user: user-8
content: 同意一楼，楼主你那样写是有可能出错的，精度不能保证

user: user-9
content: #include<stdio.h> #define eps 1e-8//0.00000001 int main() {         double m;//这里最好用double，float的精度不够。         scanf("%f",&m);/*请输入0.8*/         if(m <= 0.8+eps)                 printf("YES\n");         else                 printf("NO\n"); /* m大于0.8 */         return 0; }

user: user-4
content: 首先，你要清楚， 0.8 在二进制的世界中是无法精确表示的。就如同 1/3.0 在十进制世界中无法精确表示一样。  其次，你要了解， 0.8 是 double 浮点数常量，而 0.8f 才是 float 浮点数常量。  所以：0.8 != 0.8f  float f1 = 0.8; float f2 = 0.8f; double d1 = 0.8; double d2 = 0.8f;  f1 == f2 == d2 != d1

user: user-9
content: #include<stdio.h>  #define eps 1e-8//0.00000001 int main() {         float m;         scanf("%f",&m);/*请输入0.8*/         if(m <= 0.8+eps)                 printf("YES\n");         else                 printf("NO\n"); /* m大于0.8 */         return 0; } 这样试试，浮点数比较要用个很小的小数作为0比较。 比如，一个浮点数和0比较，要这样做： double f=0.000000001; f<eps && f>-eps 才算等于0

user: user-2
content: 引用 12 楼 u013163178 的回复:[quote=引用 8 楼 dbzhang800 的回复:] 楼主的问题其实很简单：就是 0.8f != 0.8 这个float 和 double 问题，就像10进制里面的 0.33333333 和 0.3333333333333333不相等一样。  而向 float 比较 0.8f == 0.8f 或 double 比较0.8 == 0.8 都是没问题的原来如此，那请问整数怎么比较大小 的呢，12和11是怎么比较的，做减法然后与0 比较吗[/quote] 《数字电路》＋《计算机组成原理》＋《The Intel 64 and IA-32 Architectures Software Developer's Manual》

user: user-10
content: 原因在于10进制字符串“0.8”scanf到float m时已经有误差。

user: user-10
content: 原因在于10进制字符串“0.8”scanf到float m时已经有误差。

user: user-10
content: 原因在于10进制字符串“0.8”scanf到float m时已经有误差。

user: user-0
content: 引用 8 楼 dbzhang800 的回复:楼主的问题其实很简单：就是 0.8f != 0.8 这个float 和 double 问题，就像10进制里面的 0.33333333 和 0.3333333333333333不相等一样。  而向 float 比较 0.8f == 0.8f 或 double 比较0.8 == 0.8 都是没问题的原来如此，那请问整数怎么比较大小 的呢，12和11是怎么比较的，做减法然后与0 比较吗

user: user-0
content: 引用 8 楼 dbzhang800 的回复:楼主的问题其实很简单：就是 0.8f != 0.8 这个float 和 double 问题，就像10进制里面的 0.33333333 和 0.3333333333333333不相等一样。  而向 float 比较 0.8f == 0.8f 或 double 比较0.8 == 0.8 都是没问题的原来如此，那请问整数怎么比较大小 的呢，12和11是怎么比较的，做减法然后与0 比较吗

user: user-0
content: 引用 8 楼 dbzhang800 的回复:楼主的问题其实很简单：就是 0.8f != 0.8 这个float 和 double 问题，就像10进制里面的 0.33333333 和 0.3333333333333333不相等一样。  而向 float 比较 0.8f == 0.8f 或 double 比较0.8 == 0.8 都是没问题的原来如此，那请问整数怎么比较大小 的呢，12和11是怎么比较的，做减法然后与0 比较吗