Ошибка в цикле while?

Я сделал простой пример для подсчета десятичных знаков, но он не останавливается и не дает мне правильного ответа, вот мой код:

double b=76327741.125;
int count=0;
while(b - (int)b > 0.0)
    {
        b*=10;            
        count++;          
    } 
        cout<<count;

ответ должен быть:

3

но вместо этого цикл while продолжает работать бесконечно ... что не так с моим кодом?


person Dreamer    schedule 15.09.2014    source источник
comment
Я думаю, вы забыли вычесть из b. Добавьте b-=10 выше b*=10, и все будет работать нормально.   -  person Aart Stuurman    schedule 15.09.2014
comment
Возможный дубликат: stackoverflow.com/questions/17837654/   -  person benipalj    schedule 15.09.2014
comment
Это не то же самое @cyrus   -  person Dreamer    schedule 15.09.2014
comment
@user3397351 user3397351 Мой ответ на ваш предыдущий вопрос не сработал? Для double все, что вам нужно сделать, это изменить константы (мантисса 23 -> 52, экспонента 8 -> 11), ширину переменных (uint32_t -> uint64_t) и __builtin_ctz() -> __builtin_ctzll()... Если вы используете MSVC вы можете использовать #include <intrin.h>, затем _BitScanForward(&umanctz, value).   -  person Iwillnotexist Idonotexist    schedule 15.09.2014


Ответы (2)


Вероятно, вам следует установить b равным b - int(b), чтобы убедиться, что он не увеличивается (и, возможно, переполняется).

double b=76327741.125;
int count=0;
while(b - (int)b > 0.0)
{
  b = b - int(b); // Note the change here.
  b*=10;
  count++;          
} 
cout<<count;
person Sidd    schedule 15.09.2014
comment
это работает, но единственная проблема - потерять значение b - person Dreamer; 15.09.2014
comment
Создайте переменную tmp, значение которой вы можете потерять. - person Sidd; 16.09.2014

Вы должны были сначала проверить INT_MAX. Номер был бы другим. Это зависит от того, используете ли вы код на 32-битной или 64-битной машине. Если он намного меньше, чем ваш первоначальный b, вы определенно окажетесь в бесконечном цикле. Например, максимальное значение короткого целочисленного типа равно 32767. В этом случае условие вашего цикла будет таким: 76327741.125 - some negative number, больше 0. Однако в цикле вы увеличили значение b. В следующий раз, когда мы попадем в строку условия, это будет что-то вроде этого: 76327741.125*10 - some negative number

person Decipher    schedule 15.09.2014
comment
Вы имеете в виду while(b - (int)b > 0.0) { b = b - (int)b; b*=10; count++; } - person Dreamer; 15.09.2014
comment
подробное объяснение дано @user3397351 - person Decipher; 15.09.2014
comment
Нет, компилятор вычитает правильно 76327741.125-76327741, и два значения становятся одинаковыми после трех операций *10, но я не знаю, почему он просто не останавливается, когда b-int(b)=0 - person Dreamer; 15.09.2014
comment
Он имеет в виду, что после первого b *= 10 значение b становится 763277411.25, что больше, чем максимальное значение, которое может иметь int (INT_MAX) на обычных ПК (2^32-1). - person André Sassi; 15.09.2014
comment
@user3397351 user3397351 Вам, вероятно, следовало сначала поместить (int) b в окно просмотра и проверить его значение. уверен, ты найдешь что-нибудь полезное - person Decipher; 15.09.2014