user-0 提问: 什么是0

回复:
user: user-0
content: 引用 46 楼 mcmay 的回复:[quote=引用 45 楼 wenbo228228 的回复:] 今天codeblocks编译报错如图，不知道是什么原因，还望指教 出现这种情况是因为，你看看界面的最右边那一栏里，是否有个main.c文件？那个C文件里有main()，而你的C文件里又有个main()，这里编译器就会报错说有多重对函数main()的定义了。你建立工程时选择建立空白工程（empty project）就不会出现那个默认给出的main()函数了。[/quote]  谢谢！

user: user-1
content: 引用 40 楼 wenbo228228 的回复:[quote=引用 39 楼 zhao4zhong1 的回复:] float.h #define DBL_DIG         15                      /* # of decimal digits of precision */ #define DBL_EPSILON     2.2204460492503131e-016 /* smallest such that 1.0+DBL_EPSILON != 1.0 */ #define DBL_MANT_DIG    53                      /* # of bits in mantissa */ #define DBL_MAX         1.7976931348623158e+308 /* max value */ #define DBL_MAX_10_EXP  308                     /* max decimal exponent */ #define DBL_MAX_EXP     1024                    /* max binary exponent */ #define DBL_MIN         2.2250738585072014e-308 /* min positive value */ #define DBL_MIN_10_EXP  (-307)                  /* min decimal exponent */ #define DBL_MIN_EXP     (-1021)                 /* min binary exponent */ #define _DBL_RADIX      2                       /* exponent radix */ #define _DBL_ROUNDS     1                       /* addition rounding: near */  #define FLT_DIG         6                       /* # of decimal digits of precision */ #define FLT_EPSILON     1.192092896e-07F        /* smallest such that 1.0+FLT_EPSILON != 1.0 */ #define FLT_GUARD       0 #define FLT_MANT_DIG    24                      /* # of bits in mantissa */ #define FLT_MAX         3.402823466e+38F        /* max value */ #define FLT_MAX_10_EXP  38                      /* max decimal exponent */ #define FLT_MAX_EXP     128                     /* max binary exponent */ #define FLT_MIN         1.175494351e-38F        /* min positive value */ #define FLT_MIN_10_EXP  (-37)                   /* min decimal exponent */ #define FLT_MIN_EXP     (-125)                  /* min binary exponent */ #define FLT_NORMALIZE   0 #define FLT_RADIX       2                       /* exponent radix */ #define FLT_ROUNDS      1                       /* addition rounding: near */   这是在干吗？新手看不懂……[/quote] 这是include\float.h内容节选，给出了一些浮点数相关的宏定义。

user: user-2
content: 引用 45 楼 wenbo228228 的回复:今天codeblocks编译报错如图，不知道是什么原因，还望指教 出现这种情况是因为，你看看界面的最右边那一栏里，是否有个main.c文件？那个C文件里有main()，而你的C文件里又有个main()，这里编译器就会报错说有多重对函数main()的定义了。你建立工程时选择建立空白工程（empty project）就不会出现那个默认给出的main()函数了。

user: user-0
content: 今天codeblocks编译报错如图，不知道是什么原因，还望指教

user: user-0
content: 引用 42 楼 mcmay 的回复:用以下有点无赖的代码测试，表示无穷大：  #include <stdio.h>  int main(void) {     float zero_f = 0.;     int zero_n = 0;      //printf("5/zero_n: %d\n", 5/zero_n);  这个除数和被除数都是int的，编译无错无警告，但运行时就会崩溃                                                                    //这说明除数是真正的0，即数中每一个二进制位都为0     printf("5.0/zero_n: %f\n", 5.0/zero_n); //这个得到的结果是inf，表示无穷大                                                                        //由于除数是5.0（是个float），被除数也被强转为float                                                                       //但可以看出整数0强转为float后，并非是真正的0     printf("5./(int)0: %f\n", 5./(int)0);         //这里得到的结果同上，但编译时被警告除数为0，而上面的却没有警告                                                                     //这里的道理应该也同上，只不过除数被除数都是常量                                                                      //这里(int)0将这个除数0先强转int（可能是这个导致了警告），                                                                    //然后由于被除数是float型的，因此，在做除法运算时就又强转为float     printf("5.0/zero_f: %f", 5.0/zero_f);    //这个得到的结果也是提示inf                                                                   //这里的zero_f是个float类型的0，但它不是像int类型的0                                                                   //那样0的干脆，即它并非所有位都为0     printf("5/.0: %f", 5/.0);                       //这里得到的结果同上，只不过除数、被除数全是常量而已                                                                 //可以看得出，这个float型常量0，也并非像int型的0那样存储的     return 0; } 这里也有很多不明白的地方，例如为什么除数和被除数都是int类型的情况下，编译时没问题，而运行时会导致崩溃？但这里至少可以证明float类型的0并非如int类型的0那样是“纯净”的0，它应该是一个十分小的小数。所以，很多人比较两个float或double型的数是否相等时，喜欢用if(abs(a-b) > 0)的形式。  思路很好，证明了浮点数0不是真正的0，那么浮点0是如何定义的呢？是不是浮点数没有0呢

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

user: user-2
content: 用以下有点无赖的代码测试，表示无穷大：  #include <stdio.h>  int main(void) {     float zero_f = 0.;     int zero_n = 0;      //printf("5/zero_n: %d\n", 5/zero_n);  这个除数和被除数都是int的，编译无错无警告，但运行时就会崩溃                                                                    //这说明除数是真正的0，即数中每一个二进制位都为0     printf("5.0/zero_n: %f\n", 5.0/zero_n); //这个得到的结果是inf，表示无穷大                                                                        //由于除数是5.0（是个float），被除数也被强转为float                                                                       //但可以看出整数0强转为float后，并非是真正的0     printf("5./(int)0: %f\n", 5./(int)0);         //这里得到的结果同上，但编译时被警告除数为0，而上面的却没有警告                                                                     //这里的道理应该也同上，只不过除数被除数都是常量                                                                      //这里(int)0将这个除数0先强转int（可能是这个导致了警告），                                                                    //然后由于被除数是float型的，因此，在做除法运算时就又强转为float     printf("5.0/zero_f: %f", 5.0/zero_f);    //这个得到的结果也是提示inf                                                                   //这里的zero_f是个float类型的0，但它不是像int类型的0                                                                   //那样0的干脆，即它并非所有位都为0     printf("5/.0: %f", 5/.0);                       //这里得到的结果同上，只不过除数、被除数全是常量而已                                                                 //可以看得出，这个float型常量0，也并非像int型的0那样存储的     return 0; } 这里也有很多不明白的地方，例如为什么除数和被除数都是int类型的情况下，编译时没问题，而运行时会导致崩溃？但这里至少可以证明float类型的0并非如int类型的0那样是“纯净”的0，它应该是一个十分小的小数。所以，很多人比较两个float或double型的数是否相等时，喜欢用if(abs(a-b) > 0)的形式。

user: user-3
content: 越写越复杂了。。。32位下float就是精确到小数点后6位的，所以用到了0.000001

user: user-4
content: if（x==0） { }

user: user-0
content: 引用 39 楼 zhao4zhong1 的回复:float.h #define DBL_DIG         15                      /* # of decimal digits of precision */ #define DBL_EPSILON     2.2204460492503131e-016 /* smallest such that 1.0+DBL_EPSILON != 1.0 */ #define DBL_MANT_DIG    53                      /* # of bits in mantissa */ #define DBL_MAX         1.7976931348623158e+308 /* max value */ #define DBL_MAX_10_EXP  308                     /* max decimal exponent */ #define DBL_MAX_EXP     1024                    /* max binary exponent */ #define DBL_MIN         2.2250738585072014e-308 /* min positive value */ #define DBL_MIN_10_EXP  (-307)                  /* min decimal exponent */ #define DBL_MIN_EXP     (-1021)                 /* min binary exponent */ #define _DBL_RADIX      2                       /* exponent radix */ #define _DBL_ROUNDS     1                       /* addition rounding: near */  #define FLT_DIG         6                       /* # of decimal digits of precision */ #define FLT_EPSILON     1.192092896e-07F        /* smallest such that 1.0+FLT_EPSILON != 1.0 */ #define FLT_GUARD       0 #define FLT_MANT_DIG    24                      /* # of bits in mantissa */ #define FLT_MAX         3.402823466e+38F        /* max value */ #define FLT_MAX_10_EXP  38                      /* max decimal exponent */ #define FLT_MAX_EXP     128                     /* max binary exponent */ #define FLT_MIN         1.175494351e-38F        /* min positive value */ #define FLT_MIN_10_EXP  (-37)                   /* min decimal exponent */ #define FLT_MIN_EXP     (-125)                  /* min binary exponent */ #define FLT_NORMALIZE   0 #define FLT_RADIX       2                       /* exponent radix */ #define FLT_ROUNDS      1                       /* addition rounding: near */   这是在干吗？新手看不懂……

user: user-5
content: 搞那么复杂？难道6楼的方法不好吗？

user: user-1
content: float.h #define DBL_DIG         15                      /* # of decimal digits of precision */ #define DBL_EPSILON     2.2204460492503131e-016 /* smallest such that 1.0+DBL_EPSILON != 1.0 */ #define DBL_MANT_DIG    53                      /* # of bits in mantissa */ #define DBL_MAX         1.7976931348623158e+308 /* max value */ #define DBL_MAX_10_EXP  308                     /* max decimal exponent */ #define DBL_MAX_EXP     1024                    /* max binary exponent */ #define DBL_MIN         2.2250738585072014e-308 /* min positive value */ #define DBL_MIN_10_EXP  (-307)                  /* min decimal exponent */ #define DBL_MIN_EXP     (-1021)                 /* min binary exponent */ #define _DBL_RADIX      2                       /* exponent radix */ #define _DBL_ROUNDS     1                       /* addition rounding: near */  #define FLT_DIG         6                       /* # of decimal digits of precision */ #define FLT_EPSILON     1.192092896e-07F        /* smallest such that 1.0+FLT_EPSILON != 1.0 */ #define FLT_GUARD       0 #define FLT_MANT_DIG    24                      /* # of bits in mantissa */ #define FLT_MAX         3.402823466e+38F        /* max value */ #define FLT_MAX_10_EXP  38                      /* max decimal exponent */ #define FLT_MAX_EXP     128                     /* max binary exponent */ #define FLT_MIN         1.175494351e-38F        /* min positive value */ #define FLT_MIN_10_EXP  (-37)                   /* min decimal exponent */ #define FLT_MIN_EXP     (-125)                  /* min binary exponent */ #define FLT_NORMALIZE   0 #define FLT_RADIX       2                       /* exponent radix */ #define FLT_ROUNDS      1                       /* addition rounding: near */

user: user-6
content: 学习了。。

user: user-7
content: 引用 36 楼 lin5161678 的回复:[quote=引用 35 楼 nice_cxf 的回复:] 一群就知道胡扯的 判断浮点数是否为0就是用＝＝0.0f，如果考虑浮点数的计算误差要根据实际情况来看是多少 #define  ELLIPSE 1e-6  //具体是多少要根据实际情况看数据的大小而不是一个确定值 if (abs(f)<ELLIPSE)   // 除去计算误差是否为0你也算是在瞎扯 abs 是求整数绝对值 结果是int类型的 用错了[/quote] 写错了，应该是fabs，其实就是要看实际情况这个计算误差到底在多少你认为可以是忽略不计的

user: user-8
content: 引用 35 楼 nice_cxf 的回复:一群就知道胡扯的 判断浮点数是否为0就是用＝＝0.0f，如果考虑浮点数的计算误差要根据实际情况来看是多少 #define  ELLIPSE 1e-6  //具体是多少要根据实际情况看数据的大小而不是一个确定值 if (abs(f)<ELLIPSE)   // 除去计算误差是否为0你也算是在瞎扯 abs 是求整数绝对值 结果是int类型的 用错了

user: user-7
content: 一群就知道胡扯的 判断浮点数是否为0就是用＝＝0.0f，如果考虑浮点数的计算误差要根据实际情况来看是多少 #define  ELLIPSE 1e-6  //具体是多少要根据实际情况看数据的大小而不是一个确定值 if (abs(f)<ELLIPSE)   // 除去计算误差是否为0

user: user-9
content: 工控机是不是用C语言来编写的

user: user-0
content: 引用 26 楼 wenbo228228 的回复:[quote=引用 23 楼 dabing16888 的回复:] #include<stdio.h> int main(void) {     float i=-88;     int j;     for(j=0;j<89;j++)     {         printf("%d\n",j);         float k=i;         k+=j;         if(k==0.0||k==-0.0)             puts("k==0");              } }  这个代码我没有看懂，为什么在for循环中定义 float k=i？还有应该会输出一次“k=0”吧，为什么没有输出任何东西？[/quote]  sorry我看错了，输出正常，但是为什么在for循环中定义 float k=i？一般都在外面声明变量吧？

user: user-0
content: 引用 23 楼 dabing16888 的回复:#include<stdio.h> int main(void) {     float i=-88;     int j;     for(j=0;j<89;j++)     {         printf("%d\n",j);         float k=i;         k+=j;         if(k==0.0||k==-0.0)             puts("k==0");              } }  这个代码我没有看懂，为什么在for循环中定义 float k=i？还有应该会输出一次“k=0”吧，为什么没有输出任何东西？

user: user-0
content: 引用 21 楼 Falleyes 的回复:[quote=引用 17 楼 lin5161678 的回复:] [quote=引用 5 楼 Falleyes 的回复:] 简单点： if (abs(f)<1e-6) 注意#include<math.h>abs是用于整数取绝对值  而且 abs 是stdlib.h 而不是是math.h [/quote]这是我的失误，但是math.h和stdlib.h中都有abs和fabs。   引用 20 楼 wenbo228228 的回复:我查百度，ABS是取整数的绝对值，fabs取实数的绝对值。 但是ABS在这个程序中明明是对小数取了绝对值啊  我又试fabs: #include <stdio.h>  //判断一个数是否为0 #include <math.h> int main() { 	float x; 	scanf("%f",&x); 	if (fabs(x)<1e-6) 	{ 		printf("是0"); 	} 	return 0; }  输入0和0.000001都说是0，真是无语了因为0.000001就是1e-6，不满度<1e-6，所以不会显示为0。如果你继续向0.000001后添加若干0并添加一个1（不要超过精度范围），就会变成不是0了。abs确实是取整形绝对值，在运行时，会自动将参数中的浮点型隐式转换为整形，比如0.1就会转化为0。应该使用fabs，这个是我的失误！ #include<stdio.h> #include<math.h>  int main(){     float f;     do{         scanf("%f",&f);         if(fabs(f)<1e-6)             puts("Yes");         else             puts("No");     }while(1); } [/quote]  你新给出的代码我运行，输入0.000001显示"YES",怎么会这样，难道不同电脑运行结果不一样？我是win7  64位，notepad写代码，gcc编译的