终止小数

时间:2016-11-23 23:36:00

标签: c++ floating-point precision

#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/1}的1/5,但输出为:1/5 : Terminates

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

2 个答案:

答案 0 :(得分:5)

在您的情况下,有一种简单的方法可以询问比率是否在给定的基数中具有精确的终止表示。

第1步是将其降低到最低值。将顶部和底部除以最高公因数。

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

答案 1 :(得分:3)

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

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