Почему нет Math.Pow, который принимает int как экспонента?

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

Ответ 1

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

n m= e m × ln n

Ответ 2

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

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

Ответ 3

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

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

Ответ 4

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

int intPow(int a,int b){
  int answer = a;
  int i;
  for(i=0;i<b-1;i++)
    answer *= a;
  return answer;
}