2013-05-27 51 views
0

请帮我编码。我想制作一个这样的程序。对不起英文不好。N = 2^x,如果为真,则为true。为什么它错了?

给定的输入:

N 
where N is an integer. 

回报:

True if N = 2^x, where x is an integer. 

我试图做到这一点,但它不工作,因为我想要的。

using namespace std; 
int main() 
{ 
    float a,b,c; 
    cin>>a; 
    c=log10(a)/log10(2.0); 
    b=pow(2,c); 
    if(b==a) 
    { 
     cout<<"TRUE"<<endl;} 
    else 
     cout<<"FALSE"<<endl;{ 
    } 
} 

请帮助我。谢谢。

+1

尝试打印'b'和'a',以及中间计算结果(在本例中为print'c')。他们是一样的价值吗?为什么或者为什么不? – Patashu

+0

浮点算术,特别是对数运算,由于有限精度而引入一些不精确 –

+0

我想我正在做第10次......你的变量是浮点数,并且它们在计算机内存中没有以精确的方式表示。谷歌它,你会发现很多信息:) – sashkello

回答

0

c = log10(a)/ log10(2.0);如果要使用此值,则声明值a,b,c为double。

如果你想使用这个值,将值a,b,c声明为float float c = log10(a)/ log10(2.0f);

我执行的程序与这两个变化,一个接一个。它的两个 检查工作的语法和示例here

5

由于What Every Computer Scientist Should Know About Floating-Point Arithmetic解释说,在计算机程序中浮点数假装他们可以代表任何实数,但实际上只有32位或64位,所以你会四舍五入到最接近的表示。即使是看起来很简单的数字,如0.1,在二进制文件中也有无穷无尽的表示,因此会变得圆满。对cospow等浮点数进行操作的函数就其性质而言,有时会因为“正确”结果不是可代表的浮点而给出“错误”结果。

有时解决方案很复杂。然而,在这种情况下,解决方案非常简单 - 检查两个数字的差异是否小于epsilon,其中epsilon足够小以提供您所需的准确性。例如

float epsilon = 0.0001; 
if(abs(b-a) < epsilon) 

而且,当你需要的准确性比速度和规模更,使用double优先于float。这是两倍大,因此许多重要的地方更精确。

+0

啊我明白了,谢谢。 –

0

我认为应该阅读代码(给出问题描述)。你想知道N是否是2的幂?

编辑代码

#include <iostream> 

int main() 
{ 
    unsigned int N; 
    std::cout << "Input a number "; 
    std::cin >> N; 
    unsigned int two_to_the_power_of_bit = 0; 
    do { 
     std::cout << "Working on " << 
      two_to_the_power_of_bit << std::endl; 
     if (two_to_the_power_of_bit == N) { 
      std::cout << "TRUE" << std::endl; 
      return 0; 
     } 

     if (two_to_the_power_of_bit > N) { 
      std::cout << "FALSE" << std::endl; 
      return 1; 
     } 

     if (two_to_the_power_of_bit == 0) { 
      two_to_the_power_of_bit = 1; 
     } else { 
      two_to_the_power_of_bit <<= 1; 
     } 
    } while(two_to_the_power_of_bit); 
} 

如果我收到了你的问题错了,你可以请你澄清?

Output: 
Input a number 3 
Working on 0 
Working on 1 
Working on 2 
Working on 4 
FALSE 
[email protected]:~/Devel/test$ ./a.out 
Input a number 4 
Working on 0 
Working on 1 
Working on 2 
Working on 4 
TRUE 
[email protected]:~/Devel/test$ ./a.out 5 
Input a number 5 
Working on 0 
Working on 1 
Working on 2 
Working on 4 
Working on 8 
FALSE 
[email protected]:~/Devel/test$ 
+0

是的,这就是我的意思。但它不起作用。 thx虽然帮助。 –

+0

@PrajogoAtmaja编辑代码,这将解决您的问题。该代码还会导致运行时间更快。 –

相关问题