C# 用堆栈机用Brouncker公式逼近PI
我正在研究如何将这个公式转换为基于Brouncker的PI的近似值,并将其转换为堆栈机器 我用的公式是4/1+1^2/2+3^2/2+5^2/2+7^2/2+9^2/2,大约是2.97。如何将其转换为堆栈机器代码 这是我到目前为止所知道的,但这是错误的:C# 用堆栈机用Brouncker公式逼近PI,c#,stack,pi,stack-machine,C#,Stack,Pi,Stack Machine,我正在研究如何将这个公式转换为基于Brouncker的PI的近似值,并将其转换为堆栈机器 我用的公式是4/1+1^2/2+3^2/2+5^2/2+7^2/2+9^2/2,大约是2.97。如何将其转换为堆栈机器代码 这是我到目前为止所知道的,但这是错误的: DIV PUSH 4 DIV ADD PUSH 1 POW PUSH 1 PUSH 2 DIV ADD POW PUSH 3 PUSH 2 PUSH 2 DIV ADD POW PUSH 5 PUSH 2 PUSH 2 DIV ADD POW
DIV
PUSH 4
DIV
ADD
PUSH 1
POW
PUSH 1
PUSH 2
DIV
ADD
POW
PUSH 3
PUSH 2
PUSH 2
DIV
ADD
POW
PUSH 5
PUSH 2
PUSH 2
DIV
ADD
POW
PUSH 7
PUSH 2
PUSH 2
ADD
DIV
POW
PUSH 9
PUSH 2
PUSH 2
PUSH 2
说明从下到上阅读
它以4除以4.0909结束,但它应该以1.344除以4。
有一些数学语法是错误的,但我试过了,还没有找到我错的地方
如果需要,这是我为阅读说明而创建的类,它是C语言的,但应该被广泛理解:
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
namespace Máquinas
{
/**
* @author toyomitsu
*
* @date - 2020.05.17
*/
public class StackMachine
{
private Stack<string> _Stack;
private string[] _Instructions;
public StackMachine(string[] Instructions)
{
Array.Reverse(Instructions);
_Stack = new Stack<string>();
_Instructions = Instructions;
}
public void PerformInstructions()
{
Console.WriteLine();
Console.WriteLine("*** Stack machine ***");
foreach (string Instruction in _Instructions)
{
string[] InstData = Instruction.Split(' ');
switch (InstData[0])
{
case "PUSH":
Push(InstData[1]);
break;
case "POP":
Pop();
break;
case "ADD":
Add();
break;
case "SUB":
Sub();
break;
case "MOD":
Mod();
break;
case "MUL":
Mul();
break;
case "DIV":
Div();
break;
case "POW":
Pow();
break;
case "SQR":
Sqr();
break;
case "EXP":
Exp();
break;
default:
continue;
}
List<string> Registry = _Stack.ToList<string>();
Console.WriteLine();
Console.WriteLine(string.Format("** Instruction: {0} **", Instruction));
for (int i = 0; i < Registry.Count; i++)
{
Console.WriteLine(string.Format("Registry {0}: {1}", i + 1, Registry[i]));
}
Console.WriteLine("**********************");
}
}
#region Functions
private void Push(string Data)
{
_Stack.Push(Data);
}
private string Pop()
{
return _Stack.Pop();
}
private void Add()
{
string Data1 = Pop();
string Data2 = Pop();
double Num1 = double.Parse(Data1, CultureInfo.InvariantCulture);
double Num2 = double.Parse(Data2, CultureInfo.InvariantCulture);
double Result = Num1 + Num2;
Push(Result.ToString(CultureInfo.InvariantCulture));
}
private void Sub()
{
string Data1 = Pop();
string Data2 = Pop();
double Num1 = double.Parse(Data1, CultureInfo.InvariantCulture);
double Num2 = double.Parse(Data2, CultureInfo.InvariantCulture);
double Result = Num1 - Num2;
Push(Result.ToString(CultureInfo.InvariantCulture));
}
private void Mul()
{
string Data1 = Pop();
string Data2 = Pop();
double Num1 = double.Parse(Data1, CultureInfo.InvariantCulture);
double Num2 = double.Parse(Data2, CultureInfo.InvariantCulture);
double Result = Num1 * Num2;
Push(Result.ToString(CultureInfo.InvariantCulture));
}
private void Mod()
{
string Data1 = Pop();
string Data2 = Pop();
double Num1 = double.Parse(Data1, CultureInfo.InvariantCulture);
double Num2 = double.Parse(Data2, CultureInfo.InvariantCulture);
double Result = Num1 % Num2;
Push(Result.ToString(CultureInfo.InvariantCulture));
}
private void Div()
{
string Data1 = Pop();
string Data2 = Pop();
double Num1 = double.Parse(Data1, CultureInfo.InvariantCulture);
double Num2 = double.Parse(Data2, CultureInfo.InvariantCulture);
double Result = Num1 / Num2;
Push(Result.ToString(CultureInfo.InvariantCulture));
}
private void Pow()
{
string Data1 = Pop();
string Data2 = Pop();
double Num1 = double.Parse(Data1, CultureInfo.InvariantCulture);
double Num2 = double.Parse(Data2, CultureInfo.InvariantCulture);
double Result = Math.Pow(Num1, Num2);
Push(Result.ToString(CultureInfo.InvariantCulture));
}
private void Sqr()
{
string Data1 = Pop();
double Num1 = double.Parse(Data1, CultureInfo.InvariantCulture);
double Result = Math.Sqrt(Num1);
Push(Result.ToString(CultureInfo.InvariantCulture));
}
private void Exp()
{
string Data1 = Pop();
double Num1 = double.Parse(Data1, CultureInfo.InvariantCulture);
double Result = Math.Exp(Num1);
Push(Result.ToString(CultureInfo.InvariantCulture));
}
#endregion
}
}
您已翻译了2+7^2/.x。。放入x,2,2,7,^,+,/其中x是临时堆栈结果
这不会导致2+7^2/x吗?你不想要x,2,7,^,/,2,+
DIV
PUSH 4
ADD
PUSH 1
DIV
POW
PUSH 1
PUSH 2
ADD
PUSH 2
DIV
POW
PUSH 3
PUSH 2
ADD
PUSH 2
DIV
POW
PUSH 5
PUSH 2
ADD
PUSH 2
DIV
POW
PUSH 7
PUSH 2
ADD
PUSH 2
DIV
POW
PUSH 9
PUSH 2
PUSH 2