| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2527 人关注过本帖
标题:浮点数精度问题,怎么才能保证累加不出现误差
只看楼主 加入收藏
q472440947
Rank: 1
等 级:新手上路
帖 子:12
专家分:0
注 册:2014-7-13
结帖率:100%
收藏
 问题点数:0 回复次数:22 
浮点数精度问题,怎么才能保证累加不出现误差
#include <stdio.h>
#include <conio.h>
main()
{
    float x,y;
    for(x=0.0;x<71.0;x=x+0.1)
        for(y=0.0;y<71.0;y=y+0.1)
        {
            if(x+y==71.00)
            {
                printf("%f,%f\n",x,y);
                getch();
            }
        }
       getch();

}
运行后为什么只有2个结果。x+y==71  不是应该有很多很多结果吗

改成for(x=0.0;x<71.0;x=x+1)   for(y=0.0;y<71.0;y=y+1)   加整数都能正常运行,但加零点几结果就不对了   为什么??
如果确定为浮点数精度问题  要求必须用浮点数 那怎么使用  才能实现x=x+0.1的累加不出现误差,

[ 本帖最后由 q472440947 于 2014-7-14 23:38 编辑 ]
搜索更多相关主题的帖子: include 
2014-07-13 11:05
zhu224039
Rank: 8Rank: 8
等 级:贵宾
威 望:17
帖 子:862
专家分:792
注 册:2012-7-29
收藏
得分:0 
getch() 需要头文件 conio.h
main()是不规范的写法  应该改称 int main()
立即数请在后面指名立即数类型 默认情况下编译器认为带小数的数为double 类型


#include <stdio.h>
#include <conio.h>

int main()
{
    float x,y;
    for(x=0.0f;x<71.0f;x=x+0.1f)
        for(y=0.0f;y<71.0f;y=y+0.1f)
        {
            if(x+y==71.00f)
            {
                printf("%f,%f\n",x,y);
                getch();
            }
        }
       getch();

}

更正后 运行良好

我要成为嘿嘿的黑客,替天行道
2014-07-13 11:24
zhu224039
Rank: 8Rank: 8
等 级:贵宾
威 望:17
帖 子:862
专家分:792
注 册:2012-7-29
收藏
得分:0 

谭老师告诉你这么搞的?

我要成为嘿嘿的黑客,替天行道
2014-07-13 11:26
q472440947
Rank: 1
等 级:新手上路
帖 子:12
专家分:0
注 册:2014-7-13
收藏
得分:0 
回复 2 楼 zhu224039
为什么我运行起来只有2个结果
2014-07-13 11:40
wssy213
Rank: 12Rank: 12Rank: 12
来 自:湖南
等 级:贵宾
威 望:10
帖 子:967
专家分:3703
注 册:2014-6-6
收藏
得分:0 
以下是引用zhu224039在2014-7-13 11:24:36的发言:

getch() 需要头文件 conio.h  
main()是不规范的写法  应该改称 int main()
立即数请在后面指名立即数类型 默认情况下编译器认为带小数的数为double 类型
 
 
#include  
#include  
 
int main()
{
    float x,y;
    for(x=0.0f;x<71.0f;x=x+0.1f)
        for(y=0.0f;y<71.0f;y=y+0.1f)
        {
            if(x+y==71.00f)
            {
                printf("%f,%f\n",x,y);
                getch();
            }
        }
       getch();
 
}
 
更正后 运行良好

话说为什么要用立即数啊,不用也可以啊
ps:谭老师已经被你们黑的......

坚持----------------------------------唯一的道路
shit ! ! !
2014-07-13 12:02
q472440947
Rank: 1
等 级:新手上路
帖 子:12
专家分:0
注 册:2014-7-13
收藏
得分:0 
回复 5 楼 wssy213
不用立即数是什么样子的  求大神赐教
2014-07-13 12:49
周满悦
Rank: 3Rank: 3
来 自:江苏
等 级:论坛游侠
威 望:2
帖 子:42
专家分:131
注 册:2014-6-21
收藏
得分:0 
#include <stdio.h>
#include <conio.h>        //没声明 getch函数的头文件
main()
{
    float x,y;
    for(x=0.0;x<71.0;x=x+0.1)
        for(y=0.0;y<71.0;y=y+0.1)
        {
            if(x+y==71.00)
            {
                printf("%f,%f\n",x,y);
                getch();
            }
        }
       getch();

}

我只是一个自学的。
2014-07-13 16:24
wssy213
Rank: 12Rank: 12Rank: 12
来 自:湖南
等 级:贵宾
威 望:10
帖 子:967
专家分:3703
注 册:2014-6-6
收藏
得分:0 
话说没有人来解答吗
我也有点不明白啊.....  = =

坚持----------------------------------唯一的道路
shit ! ! !
2014-07-13 21:08
kaboul
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2011-8-4
收藏
得分:0 
#include <stdio.h>

int main(int argc,char * argv[])
{
    float x = 0;
    float y = 0;
   
    for(x = 0; x < 71.0; x = x + 0.1)
    {
        for(y = 0; y < 71.0; y = y + 0.1)
        {
            if(((x + y) > (71.0 - 0.000001)) && ((x + y < (71.0 + 0.000001))))
            {
                printf("[%f,%f]\r\n",x,y);
            }
        }
    }

    return 0;
}

这里的关键是浮点数的精度问题,自己可以百度搜索下,多加断点调试。问题很容易定位。
2014-07-13 21:33
wssy213
Rank: 12Rank: 12Rank: 12
来 自:湖南
等 级:贵宾
威 望:10
帖 子:967
专家分:3703
注 册:2014-6-6
收藏
得分:0 
以下是引用kaboul在2014-7-13 21:33:04的发言:

#include  
 
int main(int argc,char * argv[])
{
    float x = 0;
    float y = 0;
     
    for(x = 0; x < 71.0; x = x + 0.1)
    {
        for(y = 0; y < 71.0; y = y + 0.1)
        {
            if(((x + y) > (71.0 - 0.000001)) && ((x + y < (71.0 + 0.000001))))
            {
                printf("[%f,%f]\r\n",x,y);
            }
        }
    }
 
    return 0;
}
 
这里的关键是浮点数的精度问题,自己可以百度搜索下,多加断点调试。问题很容易定位。

soga
待我去解决掉他

坚持----------------------------------唯一的道路
shit ! ! !
2014-07-13 21:59
快速回复:浮点数精度问题,怎么才能保证累加不出现误差
数据加载中...
 
   



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

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