2015-02-23 45 views
0

在使用浮点数时使用运算符有什么问题。我们不能使用'==''< ='等运算符与浮点数吗?为什么我们不能使用带有浮点数的运算符?

这里是代码。

# include <iostream> 

using namespace std; 

main(){ 
float x, y, z; 
cout<<"1st integer: "; 
cin>>x; 

do { 
    cout<<"2nd integer: "; 
    cin>>y; 
    if(y<=0){ 
      cout<<"You can't divide by zero"<<endl; 
      continue; 
     } else { 
       break; 
       } 
     } while (1); 

z = x/y; 
cout<<"Result: "<<z; 


} 

它生成正确的结果,因为我想得到。但是从我听到的一些地方来看,使用浮点数的运算符并不是一个好逻辑。为什么?

+0

相关阅读:http://stackoverflow.com/questions/21895756/why-are-floating-point-numbers-inaccurate'0.1 + 0.2 == 0.3000 ... 4'并且是'> 0.3'(不是' == 0.3')。 – Caramiriel 2015-02-23 06:57:09

+0

@Galic,实际上两个浮点数#是完全相等的。事实上,它们可能更有可能是平等的,如果你有无限的精度。例如:float a = 1.0f,b = 1.0f;肯定会做一个== b。此外,如果delta低于float的精度,那么==(b + delta)也是正确的。有什么问题是,有时他们是不相等的,当你期望他们... – thang 2015-02-23 07:03:52

+0

@TonyD但是当我在整数变量而不是浮点使用这个程序会发生什么?我的意思是如果我输入0.50的分子值,循环不会中断,它会连续运行并显示结果,为什么?整数会丢弃小数,所以为什么它不在这里实现? – 2015-02-23 07:38:07

回答

-1

你在做什么很好。你需要注意的是使用具有浮点的相等运算符==,因为结果可能会让你感到惊讶(例如0.1 + 0.2 != 0.3)。

但是使用>,>=,<=,<没有问题。

+2

*“但是使用>,> =,<=,<。”*没有问题 - 例如,在[ideone.com这里](https://ideone.com/rgZM4j)'.1 + .2> .3'而'.3 * .3 <.9'。 – 2015-02-23 07:26:45

+1

@TonyD第一个例子是一个正确的例子,但'.3 * .3' * *小于'.9',这里'.3 * .3 ==。09'正确地评估为true。一个更好的例子可能是'.2 * .2> .04' – KillianDS 2015-02-23 08:39:44

+0

@KillianDS:哦,是的 - 是的 - 急于演示你已经知道的东西,很容易被粗心的......谢谢。 – 2015-02-23 10:06:24

-1

您可以将浮点数安全地与精确为零进行比较。这将防止零除。

你不能做的是检查x==0.1,然后除以x-0.1。由于0.1不完全可以表示,因此您将以通常未知的方向四舍五入。

+0

这是一个不好的例子。如果'x'不等于'0.1',那么'x-0.1'不会等于'0.0',并且可以安全地除以。 – TonyK 2015-02-23 08:44:26

+0

@TonyK:你的陈述对于IEEE754来说是正确的,对于4种基本的算术运算,IEEE754具有比特完美的四舍五入,但C++没有要求IEEE754。 – MSalters 2015-02-23 08:46:46

+0

'x-0.1'将会非常非零 - 在最坏的情况下,绝对值大约为'0.05 * epsilon'。这是IEEE 32位格式的“0.1 * 2^-24”;对于这种格式,即使没有使用非规格化数字,最小的可表示正数为'2^-126'。对于任何实际的浮点表示,这种巨大的差异不会消失。 – TonyK 2015-02-23 08:59:47

相关问题