圆整错误——有关浮点型

作者在 2011-08-08 11:44:17 发布以下内容
暂时用C++的例子(引用《C++程序设计学习指导与习题答案 (第2版)》)。
示例2.14
#include<iostream>
using namespace std;
int main()
{
    //illustrates round-off error::
    double x=1000/3.0;    //x=1000/3
    cout<<"x="<<x<<endl;
    double y=x-333.0;    //y=1/3
    cout<<"y="<<y<<endl;
    double z=3*y-1.0;    //z=3*(1/3)-1
    cout<<"z="<<z<<endl;
    if(z==0)
        cout<<"z==0.\n";
    else
        cout<<"z does not equal 0.\n";
    return 0;
}
运行结果(本人用VC++6.0):
x=333.333
y=0.333333
z=-5.6843e-014
注意:z不等于0.
在准确的算术中,变量具有的值为x=333又1/3,y=1/3,z=0。但1/3无法准确地表示为一个浮点值。这种不精确性反映在z的余数值上。
因此最好避免测试浮点型的相等性。
 
C/C++ | 阅读 1029 次
文章评论,共6条
贾文慧
2011-08-19 12:29
1
为了骗积分,赞一个
贾文慧
2011-08-19 12:29
2
为了骗积分,赞一个
laznrbfe(作者)
2011-08-20 11:17
3
<img src="image/face/17.gif" class="face">姐姐是想我了才来的吧~~~
laznrbfe(作者)
2011-08-20 11:17
4
<div class="quote"><span class="q"><b>贾文慧</b>: 为了骗积分,赞一个</span></div>姐姐是想我了才来的吧~~~<img src="image/face/17.gif" class="face">
迷途精灵
2011-08-21 11:54
5
看不懂,c++现在还没有能力学好,路过,表示一下
laznrbfe(作者)
2011-08-23 15:55
6
<div class="quote"><span class="q"><b>迷途精灵</b>: 看不懂,c++现在还没有能力学好,路过,表示一下</span></div>#include&lt;stdio.h&gt;<br />
int main()<br />
{<br />
&nbsp; &nbsp; &nbsp; &nbsp; //illustrates round-off error::<br />
&nbsp; &nbsp; &nbsp; &nbsp; double x=1000/3.0;&nbsp; &nbsp; &nbsp; &nbsp; //x=1000/3<br />
&nbsp; &nbsp; &nbsp; &nbsp; printf(&quot;x=%lf&quot;,x);<br />
&nbsp; &nbsp; &nbsp; &nbsp; printf(&quot;\n&quot;);<br />
&nbsp; &nbsp; &nbsp; &nbsp; double y=x-333.0;&nbsp; &nbsp; &nbsp; &nbsp; //y=1/3<br />
&nbsp; &nbsp; &nbsp; &nbsp; printf(&quot;y=%lf&quot;,y);<br />
&nbsp; &nbsp; &nbsp; &nbsp; printf(&quot;\n&quot;);<br />
&nbsp; &nbsp; &nbsp; &nbsp; double z=3*y-1.0;&nbsp; &nbsp; &nbsp; &nbsp; //z=3*(1/3)-1<br />
&nbsp; &nbsp; &nbsp; &nbsp; printf(&quot;z=%lff&quot;,z);<br />
&nbsp; &nbsp; &nbsp; &nbsp; printf(&quot;\n&quot;);<br />
&nbsp; &nbsp; &nbsp; &nbsp; if(z==0)<br />
&nbsp; &nbsp; &nbsp; &nbsp; {<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; printf(&quot;z==0\n&quot;);<br />
&nbsp; &nbsp; &nbsp; &nbsp; }<br />
&nbsp; &nbsp; &nbsp; &nbsp; else<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; printf(&quot;z does not equal 0.\n&quot;);<br />
&nbsp; &nbsp; &nbsp; &nbsp; return 0;<br />
}
游客请输入验证码
浏览48202次