C# 为什么不是';有没有以int为指数的数学?

C# 为什么不是';有没有以int为指数的数学?,c#,.net,performance,math,C#,.net,Performance,Math,我读到Math.Pow实现非常复杂,无法处理分数幂。为什么没有一个版本在不需要分数次幂的情况下,以整数作为指数来生成更快的版本呢?因为你只需要将它转换回一个浮点数,将它与基数的对数相乘 nm=em×ln n好吧,你可以自己写(用C): intintpow(inta,intb){ int-answer=a; int i; 对于(i=0;i对于编译器,只有在指数为常数的情况下,才值得通过转换为一系列倍数进行优化。在这种情况下,您可以自己编写x*x或x*x 编辑:因此,如果您想避免您的数学是由math

我读到
Math.Pow
实现非常复杂,无法处理分数幂。为什么没有一个版本在不需要分数次幂的情况下,以整数作为指数来生成更快的版本呢?

因为你只需要将它转换回一个浮点数,将它与基数的对数相乘


nm=em×ln n好吧,你可以自己写(用C):

intintpow(inta,intb){
int-answer=a;
int i;

对于(i=0;i对于编译器,只有在指数为常数的情况下,才值得通过转换为一系列倍数进行优化。在这种情况下,您可以自己编写
x*x
x*x


编辑:因此,如果您想避免您的数学是由math.Pow实现(使用指数函数)完成的,就不要调用它。如果math.Pow是为整数添加的,编译器将从如何调用它来确定它是否应该发出乘法代码(如果n是常量且很小)或者默认使用指数函数。对于编译器来说,这是非常重要的工作,在性能方面不会有任何提高。

我不认为快速数学函数在编程时是他们的首要任务(请参阅)。 他们可以使用平方指数法,这将更快,至少对于小指数


但是,由于浮点需要舍入,因此提供2种不同的输入可能意味着不同的结果,例如,对于pow(5.9,7)和pow(5.9,7.0)在某些情况下,这可能是不希望的。< /P>检查这个链接:谢谢,但是它会像MS版本一样快吗?因为他们使用了他们的POW方法的外部调用。外部调用不是直接保证速度的。谢谢亨克,我假设他们想用C++写它来加快速度。还有什么其他的原因要做?这种情况?我在这里和一个图形程序员交谈,他说处理分数幂的实现比仅仅乘以值要复杂得多,所以我假设即使我的指数不是分数,我也会受到相同的性能损失。只有更聪明(更快)的方法可以做到这一点。请注意,这在O(N)中运行。一个好的pow实现可以在O(logN)中运行。这是非常低效的。而且它无法编译。我认为OP认为
A
是一个浮点值。@David Heffernan-只是好奇,你能提供一个pow算法优于O(logN)的示例(如果解释太长,请链接)吗?快速浏览维基百科似乎没有比这更好的建议…Knuth第2卷第4.6.3节对评估能力进行了大量阐述,所以你认为如果我做数学,它会优化。Pow(3,5)?调用是外部的,所以我看不到代码。这完全没有抓住要点。
Math.Pow
不会执行一系列乘法。即使执行了,它后面的库代码也会使用中间值,即使在编译时指数未知。@BlueRaja OP清楚地指出指数只使用int。除非实现整数使用整数运算的r求幂…这可能比运行exp和ln快。保证“pow”函数的精度级别是什么?在提高到整数幂次时保证精度在0.5625ulp以内有点棘手,但在使用exp(ln(基本)*pow)时保证精度更难的是,C的扩展精度支持太糟糕了,这样的类型通常不可用,因为它们可以更容易地产生精度达到
double
的结果。
int intPow(int a,int b){
  int answer = a;
  int i;
  for(i=0;i<b-1;i++)
    answer *= a;
  return answer;
}