奔跑的鸭蛋 发表于 2014-4-13 10:19:40

做一道ACM题目碰到的一个小问题,来几位朋友帮帮忙·

以下是有问题的程序代码,输入N为1,M为5,X为10,Y为15,Z为20,单步运行时,当i加到5时,while((i*Z-a)!=(M*X+i*X) ) 中
左右应该是相等的,单步运行到这里时,左值是100.000,右值也是100.000,按照道理应该跳出循环了,但是单步时,还是跳进了while循环,这是怎么回事啊。
——————————————————————————————————————————————————————————————
#include <iostream>
using namespace std;
int main()
{
        int N;
        cin >> N;
        while(N--)
        {
                float M,X,Y,Z,a,i,sum=0;
                cin >>M;
                cin >>X;
                cin >>Y;
                cin >>Z;
               
                i=0;
                a=0;
               
                while((i*Z-a)!=(M*X+i*X) )
                {
                        i=i+0.2;
                }
        }

oggplay 发表于 2014-4-13 10:30:17

浮点数用做判断语句,很难用。当一个整数转换为一个浮点时已经存在四舍五入了。

奔跑的鸭蛋 发表于 2014-4-13 11:48:52

oggplay 发表于 2014-4-13 10:30 static/image/common/back.gif
浮点数用做判断语句,很难用。当一个整数转换为一个浮点时已经存在四舍五入了。

那就没有解决的办法了吗~~:sad

oggplay 发表于 2014-4-13 17:19:57

本帖最后由 oggplay 于 2014-4-13 17:23 编辑

奔跑的鸭蛋 发表于 2014-4-13 11:48 static/image/common/back.gif
那就没有解决的办法了吗~~
由于浮点数计算可能有误差,所以比较的时候应该判断两个数之差小于某个很小的数就应该认为相等,如
if(fabs(a,b)<0.00001)
// equal!

直接==是完全精确匹配,往往会因为计算结果有误差造成比较失败

#define EPSILON 0.000001 //根据精度需要


if ( fabs( fa - fb) < EPSILON ){printf("fa<fb\n");}

奔跑的鸭蛋 发表于 2014-4-13 17:30:30

oggplay 发表于 2014-4-13 17:19 static/image/common/back.gif
由于浮点数计算可能有误差,所以比较的时候应该判断两个数之差小于某个很小的数就应该认为相等,如
if(f ...

恩,谢谢~我看看去~~~

CL0419 发表于 2014-4-14 09:48:12

首先要理解,浮点数不能精确存储数据,所以程序员一般都不用浮点数进行判断,因为这是伤脑筋的问题,如果你真想要浮点数进行判断,那你可以先去看一下浮点数在内存中是如何存储的,然后你再看看,或许你就会知道了,其实按照你的问题,你直接在第二个while循环内,让i=5,这样就搞定了,没必要那么麻烦,也许你是想实现一下,但是有时候有些问题你可以先试着上网找一下答案,实在不行了,你再问问大家,这是一种学习的方法和态度,还有告诉你一句,真正的程序员,真正的高手,就是要学会自己寻找问题并解决问题。希望对你有帮助……

奔跑的鸭蛋 发表于 2014-4-14 10:15:38

CL0419 发表于 2014-4-14 09:48 static/image/common/back.gif
首先要理解,浮点数不能精确存储数据,所以程序员一般都不用浮点数进行判断,因为这是伤脑筋的问题,如果你 ...

谢谢这位朋友的指点,这道问题我之前我也估计是浮点精确性的问题,只是不确定,网上查的也不具体,所以来论坛寻求帮助~因为我也不太喜欢问别人,能自己解决尽量自己解决~但是有的时候实在没办法,呵呵,这道题目我的算法不是很好,正在改进,呵呵,谢谢~

最好是明天 发表于 2014-4-14 10:39:49

学习了。。。。。。。。。。。。。

枫界易城 发表于 2014-4-14 12:39:16

过来学习学习!,,,,,,
页: [1]
查看完整版本: 做一道ACM题目碰到的一个小问题,来几位朋友帮帮忙·