2014-12-06 5 views
3

У меня вопрос от моего младшего, и я не могу это исправить. Ниже приведен код, который он использует в IDE Code :: Blocks, только что загруженный с официального сайта Code::Blocks.Функция pow не работает должным образом в Code :: Blocks IDE

Это консольный проект hello world, который он только немного изменил, используя файл заголовка math.h и используя функцию pow().

#include <stdio.h> 
#include <stdlib.h> 
#include <math.h> 
int main() 
{ 
    printf("Hello world! %d\n",pow(2,2)); 
    return 0; 
} 

Выход этого кода должен быть Hello world! 4 справа? Но voila всегда Hello world! 0, если только Я использую printf("Hello world! %f\n", pow(2,2));, который синтаксически, да, совершенный и правильный. Но потом это совсем другая история.

Pow функция должна вернуть 4, double, конечно. Так что происходит? printf() работает неправильно, или есть проблема с pow().

+2

возвращаемое значение 'double' так что вы должны привести его к' (Int) ' – Rizier123

+2

Если вы используете GCC, добавьте' -Wall', и вам будет рассказано о несоответствии между форматом '% d' и значением' double'. –

ответ

1

printf("Hello world! %d\n",pow(2,2));
«Выход этого кода должен быть Привет мир 4 Хорошо!? "

Нет. Поскольку это неопределенное поведение, все может случиться. Поскольку @Mureinik опубликовал то, что, вероятно, произойдет в этой странствующей ситуации, вы могли бы понять, почему вы видели 0. Но, в конце концов, C не должен выполнять этот путь.

... Если какой-либо аргумент не правильный тип для соответствующей спецификации преобразования, поведение не определено .. C11 §7.21.6.1 9

Кастинг в (int) проблема тоже.

1) int диапазон значительно меньше double и для pow(2,100), что не удается.

2) Литье до int обрезает дробную часть по результату double, а точность pow() не определена. Это даст удивительный результат, когда pow() что-то вроде 7.99999999999999 и 7 напечатан, а не надеется на 8.000000.

Если код нуждается в целочисленной функции питания, рассмотрите unsigned long long int pow или https://stackoverflow.com/a/213897/2410359 или выполните поиск вокруг.

2

Возвращаемое значение pow() является double, как вы можете увидеть здесь:

http://www.tutorialspoint.com/c_standard_library/c_function_pow.htm

Таким образом, вы должны бросить возвращаемое значение в целое, как это:

#include <stdio.h> 
#include <stdlib.h> 
#include <math.h> 
int main() 
{ 
    printf("Hello world! %d\n",(int)pow(2,2)); 
    return 0; 
} 

В противном случае, как вы видели это выход 0!

Другой пример, чтобы показать это, вы можете попробовать это:

#include <stdio.h> 
#include <stdlib.h> 
#include <math.h> 
int main() 
{ 
    printf("Hello world! %d\n",4.000000); 
    return 0; 
} 

Как вы видите выход также 0, потому что это двойное значение!

1

Как вы отметили, pow возвращает двойной. printf, однако, не осведомлен о типах, переданных ему в стек, и если вы передадите double, где ожидается int, он просто возьмет из стека первые sizeof(int) байт и интерпретирует их как int. Например, на моей машине (gcc (GCC) 4.4.7 20120313 (Red Hat 4.4.7-4) на x86_64), эта программа напечатана Hello world! -1954378952.

Если вы хотите, чтобы рассматривать результат как int с помощью %d, вы должны явно привести его в качестве такового:

printf("Hello world! %d\n", (int)pow(2,2)); 
0

pow(2,2) будет возвращать двойной всегда.

В printf()% d и% i оба используются для печати int.Если вы используете% d или% i для двойника, это создаст проблемы. Для того, чтобы отобразить двойное использование% F или% ЛФ это даст вам правильный ответ

printf("Hello world! %f\n",pow(2,2)); 

или

printf("Hello world! %lf\n",pow(2,2));