2016-11-23 160 views
1
#include<iostream> 
#include<string> 
#include<cstdlib> 
using namespace std; 

int main() 
{ 
double a,b,res; 

while(cin>>a>>b) 
{ 
    res = a/b; 

    if((res*b) == a) 
     cout<<"Terminates"<<endl; 
    else 
     cout<<"Does not terminate"<<endl; 
} 

return 0; 
} 

所以,这里是我的代码,看看如果a/b导致终止小数或不。一些输入产生正确的输出,如:终止十进制

1/3:不终止,

1/9:不终止,

1/7:不终止,

22/7:不终止,

1/2:终止。

除1/5应显示:1/5 : Terminates,但输出为:Does not terminates

我知道C++浮点存在很多问题,试图谷歌,但它就像一个谜题。

+2

在二进制算术中,1/5是非终止分数。 –

+0

你能解释更多请@PatriciaShanahan – inhaler

+0

好的,我有种得到它@PatriciaShanahan – inhaler

回答

5

有一个简单的方法来询问的比率是否具有在给定的基数中的一个精确的,终止的表示,你的情况10.

步骤1是将其降低到它的最低条件。按照最高的公因数划分顶部和底部。

现在只有分母很重要。如果它的每个主要因素都是基数的主要因素,则分数将以该基数结束。 5是10的主要因子,因此1/5以十进制结束。 5不是2的主要因素,所以1/5不以二进制结尾。

3

只有1/2,1/4,1/8等分数(或总和)在double中精确表示。所有其他人都是近似值。因此,结果1/5 * 5可能等于0.9999999999

这就是为什么一个人永远不应该比较浮点数的平等(至少不是没有要求的精度,如testedValue - num < precision)。

+0

我能在这里做什么呢? @Hcorg – inhaler

+0

或者选择精度进行比较,或者使用某些库来处理分数。定点算术可以帮助(例如Boost Multiprecission) – Hcorg

+0

我正在解决的问题是:取2个整数a和b输入并检查a/b结果终止小数。我把输入作为双重原因int/int除法将导致整数&upcasting将导致相同的@Hcorg – inhaler