2015-06-05 4 views
1

Почему это:pow (1,0) возвращает 0?

printf("%d\n", pow(1,0)); /* outputs 0 */ 

возвращается 0? Я ожидал, что он вернется 1.

+0

Я считаю, что здесь нет ничего конкретного для C89. –

ответ

10

pow() возвращает double тип. Вам нужно использовать спецификатор формата %f для печати double.

Использование спецификатора несоответствующего формата для заданного типа аргумента вызывает undefined behaviour. Проверьте главу §7.21.6.1 стандарта C N1570 (C11). (Да, это не имеет особого значения для C89, IMHO)

1

Вам нужно набрать результат для int, поскольку pow() возвращает double.

printf("%d\n",(int) pow(1,0)); 

Это даст желаемый выход 1

Примечание: pow(a,b) дает правильный результат, когда и и Ь integers, как в вашем case.But вам нужно add 0.5 результату при работе с fractions так, что результат получает округленный до ближайшего целого числа.

printf("%d\n",(int) (pow(2.1,0.9)))// will return 1. 

printf("%d\n",(int) (pow(2.1,0.9)+0.5));//will return 2. 

Надеюсь, это поможет вам.