Почему нет Math.Pow, который принимает int в качестве показателя степени? - PullRequest
12 голосов
/ 03 августа 2011

Я читал, что реализация Math.Pow довольно сложна, чтобы иметь возможность обрабатывать дробные полномочия.Почему нет версии, которая использует int для показателя, чтобы сделать более быструю версию, когда вам не нужны дробные полномочия?

Ответы [ 4 ]

6 голосов
/ 03 августа 2011

Поскольку вам просто нужно преобразовать его обратно в число с плавающей точкой, чтобы умножить его на логарифм базы.

n m = e m × ln n

1 голос
/ 03 августа 2011

Для компилятора целесообразно оптимизировать только преобразование в серию умножений, если показатель степени постоянен. В этом случае вы можете написать x*x или x*x*x самостоятельно.

Редактировать: Так что, если вы хотите избежать математики с помощью реализации Math.Pow (которая использует функции экспоненты), просто не вызывайте ее. Если Math.Pow будет добавлен для целых чисел, компилятор должен выяснить, как он вызывается, если он должен генерировать код для умножения (если n является постоянным и небольшим) или по умолчанию с использованием функций экспоненты. Это нетривиальная работа для компилятора, и не будет никакого выигрыша с точки зрения производительности.

0 голосов
/ 03 августа 2011

Я не думаю, что быстрые математические функции были их первоочередными задачами при программировании (см. Почему Math.DivRem неэффективен ). Они могли бы использовать возведение в квадрат, которое было бы быстрее, по крайней мере, для небольших показателей.

Однако, поскольку число с плавающей запятой подлежит округлению, то предоставление двух разных вложений может означать разные результаты, например, для pow (5.9,7), чем для pow (5.9,7.0), что может быть нежелательно в некоторых случаях.

0 голосов
/ 03 августа 2011

Ну, вы могли бы написать свой (в C):

int intPow(int a,int b){
  int answer = a;
  int i;
  for(i=0;i<b-1;i++)
    answer *= a;
  return answer;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...