Функция pow () C в соответствии с заголовочным файломне работает правильно - PullRequest
0 голосов
/ 18 августа 2010

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

#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

Ответы [ 2 ]

2 голосов
/ 18 августа 2010

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

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

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

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

2 голосов
/ 18 августа 2010

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

...