2013-05-27 2 views
0

, пожалуйста, помогите мне в кодировании. Я хочу сделать такую ​​программу. жаль плохой английский.N = 2^x, напишите true, если 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', а также результаты промежуточных вычислений (в этом случае напечатайте 'c'). Они одинаковы? Почему или почему нет? – Patashu

+0

Плавающая арифметика, особенно логарифмические операции, вносит некоторые неточности из-за конечной точности –

+0

Я думаю, что я делаю это в 10-й раз ... Ваши переменные плавают, и они не представлены ТОЧНЫМ способом в памяти компьютера. Google это, вы найдете много информации :) – sashkello

ответ

0

Объявите значения a, b, c как двойные, если вы хотите использовать это значение c = log10 (a)/log10 (2.0);

Объявите значения a, b, c как float, если вы хотите использовать это значение c = log10 (a)/log10 (2.0f);

Я выполнил программу с обоими этими изменениями, один за другим .Its работает как для проверки синтаксиса и пример here

5

Как What Every Computer Scientist Should Know About Floating-Point Arithmetic объясняет, числа с плавающей точкой в ​​компьютерных программах притворяются, что они могут представлять собой любое действительное число, но на самом деле имеют только 32 или 64 бита, поэтому вы получите округление до ближайшего представления. Даже цифры, которые выглядят просто, например, 0,1, имеют бесконечное представление в двоичном формате и поэтому будут округлены. Функции, которые работают с номерами с плавающей запятой, такими как cos и pow, по своей природе иногда дают вам «неправильный» результат просто потому, что «правильный» результат не является представляемой плавающей точкой.

Иногда решение является сложным. Однако в этом случае решение довольно простое - убедитесь, что разница двух чисел меньше, чем 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 Отредактировано код, который поможет вам решить вашу проблему. Код также приведет к более быстрой работе. –

Смежные вопросы