BIZZARE OUTPUT.НЕ ДОЛЖЕН БЫТЬ 153 ВМЕСТО 152 - PullRequest
0 голосов
/ 11 июня 2018
int main()
{

  char arr[3]={'1','5','3'};
  int sum=0;
  for (int i=0;i<3;i++)
  {
     sum+=pow((arr[i]-48),3);

     printf("%d to the power 3 is: %f\n",arr[i]-48,pow((arr[i]-48),3));
  }
 printf("sum is %d\n",sum);
}

Ожидаемый вывод:

1 to the power 3 is: 1.000000
5 to the power 3 is: 125.000000
3 to the power 3 is: 27.000000
sum is 153

Фактический вывод:

1 to the power 3 is: 1.000000
5 to the power 3 is: 125.000000
3 to the power 3 is: 27.000000
sum is 152

Вот изображение вывода

Следуетне будет ли 153 и НЕ 152?

Редактировать: если вместо sum + = pow ((arr [i] -48), 3);я использую
sum + = (int) (floor (pow ((arr [i] -48), 3)));

ВЫХОД ПРАВИЛЬНО ПРИХОДИТ КАК 153. Так что я не думаю, что возврат пауменьшее целое число или, в этом отношении, приведение типа с плавающей точкой к целому числу, возвращающему меньшее значение, имеет место здесь

1 Ответ

0 голосов
/ 11 июня 2018

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

Вычисление pow затруднительно, и не все реализации хорошо справляются со своей задачей.Для функций с плавающей запятой теоретически наилучшее возможное качество равно правильно округлено .Правильно округленная процедура возвращает число, представимое в формате с плавающей запятой, которое ближе всего к точному математическому результату, округленное в направлении, определяемом выбранным правилом округления.(Наиболее часто используемое правило округления заключается в округлении до ближайшего значения с привязкой к четной младшей цифре. Другие правила включают округление в направлении + ∞, в направлении −∞ и в направлении нуля.) Очень трудно вычислить pow справильное округление, и ни одна коммерческая или широко используемая реализация, о которой я знаю, не делает этого.

Тем не менее, можно спроектировать pow так, чтобы он возвращал точный результат всякий раз, когда точный результат представляется в плавающемформат точки.Насколько я помню, текущая реализация macOS pow делает это.Таким образом, рассматриваемая программа при компиляции и исполнении с помощью инструментов macOS даст ожидаемые результаты.pow от Microsoft не имеет этого свойства, поэтому вычисления pow(x, 3) могут возвращать значение, немного меньшее x 3 , даже если x 3 представимо.

Даже если используется высококачественная реализация pow, обычно желательно не использовать pow с малыми целочисленными степенями по соображениям скорости.Вычисление pow(x, 3) медленнее, чем вычисление x*x*x.

...