用指数计算公式
本文关键字:计算 指数 | 更新日期: 2023-09-27 17:58:52
我正试图将以下公式从Excel复制到C#应用程序中,但结果不同。
x=5
的答案应该是y=55.249875
,这是我刚刚使用Windows计算器完成的,与Excel的答案匹配。。但当我在C#中尝试它时就不会了。
对于E
,我使用Math.Exp
;对于x^y
,我使用Math.Pow()
。
有什么想法吗?
公式:
y = -1E-06x^6 + 0.0001x^5 - 0.0025x^4 + 0.0179x^3 + 0.0924x^2 - 0.6204x + 55.07
这将是:
static double Compute(double x)
{
return -1E-06 * Math.Pow(x, 6)
+ 0.0001 * Math.Pow(x, 5)
- 0.0025 * Math.Pow(x, 4)
+ 0.0179 * Math.Pow(x, 3)
+ 0.0924 * Math.Pow(x, 2)
- 0.6204 * x + 55.07;
}
下面是一个完整的测试程序来演示:
using System;
class Test
{
static double Compute(double x)
{
return -1E-06 * Math.Pow(x, 6)
+ 0.0001 * Math.Pow(x, 5)
- 0.0025 * Math.Pow(x, 4)
+ 0.0179 * Math.Pow(x, 3)
+ 0.0924 * Math.Pow(x, 2)
- 0.6204 * x + 55.07;
}
static void Main()
{
Console.WriteLine("Value for x {0} == {1}", 5, Compute(5));
Console.ReadKey();
}
}
我认为混乱的地方在于你假设-1E-06需要Math.Exp
,但事实并非如此。这只是科学符号中的一个简单数字。
E
是科学记数法,因此基数为10。Math.Exp
是自然幂,即e^x
。
不写-Math.Exp(-06)*Math.Pos(x, 6)
,只写-1E-06*Math.Pow(x, 6)
。
对于E,我使用Math.Exp
这是你的问题。-1E-06
是数字文字-1*10^-6(即-0.000001),而不是-1*e^-6。
试试这个:
Func<double, double> calc = x => -1E-06d*Math.Pow(x, 6)
+ 0.0001d*Math.Pow(x, 5)
- 0.0025d*Math.Pow(x, 4)
+ 0.0179d*Math.Pow(x, 3)
+ 0.0924d*Math.Pow(x, 2)
- 0.6204d*x
+ 55.07;
var y = calc(5);
Console.Out.WriteLine("y = {0}", y);
在Excel和C#中,对于X=5,我得到61.4538750。
这是C#代码:
class Program
{
static void Main(string[] args)
{
// -1E-06x^6 + 0.0001x^5 - 0.0025x^4 + 0.0179x^3 + 0.0924x^2 - 0.6204x + 55.07
var done = false;
while(!done)
{
double x;
if (!Prompt("X> ", out x, out done))
{
if (done) break;
}
var sum = Calculate(x);
Console.WriteLine("Result = {0}", sum);
}
#if DEBUG
Console.WriteLine("Press enter to exit.");
Console.ReadLine();
#endif
}
private static double Calculate(double x)
{
Console.WriteLine("Calculating -1E-06x^6 + 0.0001x^5 - 0.0025x^4 + 0.0179x^3 + 0.0924x^2 - 0.6204x + 55.07");
var coefficients = new double[] { -1e-6, +1e-4,-2.5e-3,+1.79e-2,9.24e-2,6.204e-1, 5.507e1 };
var powers = new double[] { 6,5,4,3,2,1,0 };
var sum = 0.0;
for(var i=0;i<coefficients.Length;i++)
{
var termValue = coefficients[i] * Math.Pow(x, powers[i]);
sum += termValue;
Console.WriteLine("Sum [{0}x^{1}] = {2}", coefficients[i],powers[i],termValue);
}
return sum;
//var result = -1E-6*Math.Pow(x,6) + 1E-4*Math.Pow(x,5) - 2.5E-4*Math.Pow(x,4) + 1.79E-2*Math.Pow(x,3)
}
static bool Prompt(string prompt, out double value, out bool done)
{
done=false;
var validInput = false;
Console.Write("X> ");
var xString = string.Empty;
if(!(validInput = double.TryParse(xString = Console.ReadLine(),out value)))
{
done = xString.ToLower()=="quit";
}
return validInput;
}