2013-05-27 87 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編輯代碼,這將解決您的問題。該代碼還會導致運行時間更快。 –

相關問題