| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 446 人关注过本帖
标题:判断浮点数是否为零的问题
只看楼主 加入收藏
msl12
Rank: 1
等 级:新手上路
帖 子:152
专家分:0
注 册:2015-2-6
结帖率:25%
收藏
 问题点数:0 回复次数:3 
判断浮点数是否为零的问题
如果是double类型的数a,判断是否为零,应该是fabs(a)<=1e-6呢?还是fabs(a)<=1e-15?
搜索更多相关主题的帖子: double 
2015-02-28 11:40
longwu9t
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:6
帖 子:732
专家分:2468
注 册:2014-10-9
收藏
得分:0 
#include <stdio.h>
#include <float.h>
/*****************************************************
const float   FLT_EPSILON  = 1.192092896e-07F;
const double  DBL_EPSILON  = 2.2204460492503131e-016;
*****************************************************/

#define FLOAT_ZERO(z, v) ((v < (z + DBL_EPSILON)) && (z <( v + DBL_EPSILON)))

int main() {
    double a, b, c, z, A, Z;
    a = 1.345000000000001;
    A = 1.3450000000000001;
    b = 1.123;
    c = 0.222;
    z = a - b - c;
    Z = A - b - c;

    if(FLOAT_ZERO(z, 0.0)) printf("z == 0\nz = %g\n", z);

    else printf("z != 0\nz = %g\n", z);

    printf("\n");

    if(FLOAT_ZERO(Z, 0.0)) printf("Z == 0\nZ = %g\n", Z);

    else printf("Z != 0\nZ = %g\n", Z);

    return 0;
}

Only the Code Tells the Truth             K.I.S.S
2015-02-28 12:19
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9025
专家分:54030
注 册:2011-1-18
收藏
得分:0 
应该是 if( a == 0.0 )

或者这么讲,
当你的epsilon设定越小,那么“你脑瓜里认为相等的表达式”不相等的几率就越大;
当你的epsilon设定越大,那么“你脑瓜里认为不相等的表达式”相等的几率就越大;
无论你对epsilon取什么值,都『同时』存在着“该等的不等”和“不该等的等了”的矛盾情况。
问题的根源在哪里?在于你脑袋里想的是“实数”,用的却是“浮点数”。打个比方,你想抽雪茄,却买了一块奶糖,还怪这奶糖抽起来没有茅台味。
这里实数怎么用?很遗憾,世界上,起码本宇宙内,没有。因为数学属于“形而上”。你所见的任何“实数类”都已经限制成“形而下”了。
另一个问题,所谓“相近”是无定义的,你既可以说“浙江省比江苏省大多了,相差几千平方公里呐!”,也可以说“新疆和西藏面积差不多,相差才几十万平方公里”

2015-02-28 13:29
longwu9t
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:6
帖 子:732
专家分:2468
注 册:2014-10-9
收藏
得分:0 
//按3楼的思路...

#include <stdio.h>

int main(void) {
    double a = 1.5, b = 1.125, c = 0.125, d = 0.125, e = 0.125; //浮点数用二进制可以准确表达时
    double x = a - b - c - d - e;
    double y = a - (b + c + d + e);
    printf("x = %g\n", x);
    printf("y = %g\n", y);
   
   
    if(x == 0.0) printf("x = 0\n");
    else printf("x != 0\n");

    if(y == 0.0) printf("y = 0\n");
    else printf("y != 0\n");

    if(x == y) printf("x == y\n");
    else printf("x != y\n");

    /*浮点数不能用二进制准确表达时*/
    a = 1.599, b = 1.12, c = 0.11, d = 0.27, e = 0.099;
    x = a - b - c - d - e;
    y = a - (b + c + d + e);
    printf("x = %g\n", x);
    printf("y = %g\n", y);
   
   
    if(x == 0.0) printf("x = 0\n");
    else printf("x != 0\n");

    if(y == 0.0) printf("y = 0\n");
    else printf("y != 0\n");

    if(x == y) printf("x == y\n");
    else printf("x != y\n");

    return 0;
}

Only the Code Tells the Truth             K.I.S.S
2015-02-28 14:10
快速回复:判断浮点数是否为零的问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.015701 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved