Компилятор не рассчитывает правильно? - PullRequest
0 голосов
/ 16 мая 2018

Я пытаюсь сделать простую программу, которая печатает число на оборотной стороне, у меня есть эти 2 функции:

void get_numbas(int numbah){

    for(int i = 1; i <= 5; i++){
        step1 = numbah % (int)pow(10,i);
        step2 = step1/(int)pow(10,i-1);
        std::cout << step2;
    }
}

Мой ввод для второй функции 12345, на второй итерации step1 должен стать 45, я проверил на основной

int test = 12345; 
int step1 = test % (int)pow(10,2); //45

Но когда я отлаживаю, на второй итерации я вижу, что step1 становится 69 (я понятия не имею, почему). Таким образом, мой ввод 12345, и он должен изменить его на 54321, но благодаря этому неуклюжему неверному вычислению на второй итерации он печатает 56321 (потому что он использует 69/10 вместо 45/10). У кого-нибудь есть идея, что происходит?

СКРИНШОТ МОЕГО ВЫХОДА

1 Ответ

0 голосов
/ 16 мая 2018

pow - это функция с плавающей запятой. Существуют неточности в плавающей запятой. Результат pow(10,5) может оказаться 9999.999999837204183 или что-то в этом роде. Затем ваш код округляется вниз (вместо округления до ближайшего целого числа), что приводит к непредвиденному результату.

Это объясняет ваше наблюдение 69 на второй итерации, потому что 12345 % 99 дает 69.

Я бы предложил изменить код, основанный на целочисленных значениях, чтобы не использовать промежуточные операции с плавающей запятой, например :

 uint32_t dividend = 1;

 for(int i = 1; i <= 5; i++)
 {
    step1 = numbah % (dividend * 10);
    step2 = step1 / dividend;
    dividend *= 10;
    std::cout << step2;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...