Как в этом случае работает функция pow?

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

int main()
{
int i = 11;
printf("%d ^ 2 = %d\n",i,(int)pow(i,2));
getchar();
return 0;
}

В этом случае вместо 121 я получаю 120. Какую ошибку я делаю? (Мне действительно нужно напечатать pow(i,2) как int.)


person George X    schedule 11.04.2014    source источник
comment
Зачем использовать math.h с плавающей запятой, если вам нужна int арифметика?   -  person mouviciel    schedule 11.04.2014
comment
Я получаю 121. Как вы получили 120?   -  person Engineer2021    schedule 11.04.2014
comment
Несмотря на то, что в целом существуют потенциальные проблемы с округлением, приличный pow() вернет ожидаемое 121. OP имеет математическая библиотека Schlocky.   -  person chux - Reinstate Monica    schedule 11.04.2014


Ответы (2)


Приведение к целому числу усекает дробь, возможно, pow вернуло что-то вроде 120,99999998 или около того...

Не выполняйте приведение к (int) и используйте формат %g вместо %d для печати double результата pow().

person CiaPan    schedule 11.04.2014
comment
В gcc 4.1.2 я все еще получаю 121 с этими изменениями. Не уверен, какой компилятор OP использует - person Engineer2021; 11.04.2014

Это связано с округлением от double до int.

Поскольку мощность постоянна, зачем иметь накладные расходы.

Придерживайтесь

printf("%d ^ 2 = %d\n",i, i*i);
person Ed Heal    schedule 11.04.2014