Функция C pow() согласно заголовочному файлу ‹math.h› не работает должным образом

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

#include <stdio.h>
#include <math.h>

int main() {
    int i = 0;
    for(i = 0; i < 10; i++) {
        printf("%d\t\t\t%d\t\t\t", i, (int)pow(10, i));    
        printf("%f\n", pow(10, i));
    }
    return 0;
}

Выходы:

0                       1                       1.000000

1                       10                      10.000000

2                       99                      100.000000

3                       1000                    1000.000000

4                       9999                    10000.000000

5                       100000                  100000.000000

6                       1000000                 1000000.000000

7                       9999999                 10000000.000000

8                       99999999                100000000.000000

9                       999999999               1000000000.000000

person Sanjay    schedule 18.08.2010    source источник
comment
возможный дубликат странного поведения функции pow   -  person phuclv    schedule 06.09.2015


Ответы (2)


Используйте функцию round() перед приведением к int, иначе конечные цифры будут просто усечены.

person leppie    schedule 18.08.2010
comment
Спасибо за ваш вклад, я просто забыл об этом :) - person Sanjay; 18.08.2010

Как и в случае с каждым из миллиарда других вопросов по SO, связанных с плавающей запятой :-), ответ заключается в том, что не все числа могут быть представлены точно.

И даже если они могут быть представлены точно, вы можете получить плохой результат от чего-то вроде pow, которое может работать в цикле. Другими словами, как бы ни была мала ошибка в операции, если вы делаете ее много раз, ошибка становится большой.

Попробуйте распечатать результат от pow(10,4) с помощью %.50f или другого спецификатора с плавающей запятой, и я гарантирую, что вы увидите что-то вроде 9999.9999999237623465 вместо 10000.

Что бы это ни стоило, правильные результаты получаются в gcc 3.4.4 под CygWin, поэтому вполне вероятно, что вы используете менее точную реализацию pow.

person paxdiablo    schedule 18.08.2010