.NET рдореЗрдВ рдЧрдгрд┐рддреАрдп рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпрд╛рдБ (рдкрд╛рд░реНрд╕рд┐рдВрдЧ, рд╡рд┐рднреЗрджрди, рд╕рд░рд▓реАрдХрд░рдг, рдЕрдВрд╢, рд╕рдВрдХрд▓рди)

рд╕реНрдХреВрд▓ рдХреЗ рд╕рдордп рд╕реЗ, рдореИрдВ рд╡рд┐рд╢реНрд▓реЗрд╖рдгрд╛рддреНрдордХ рд╡реНрдпреБрддреНрдкрдиреНрди рдФрд░ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдореЗрдВ рджрд┐рд▓рдЪрд╕реНрдкреА рд▓реЗ рд░рд╣рд╛ рдерд╛ред рдпрд╣ рдХрд╛рд░реНрдп рдмрд╛рдж рдореЗрдВ рд╡рд┐рд╢реНрд╡рд╡рд┐рджреНрдпрд╛рд▓рдп рдореЗрдВ рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рдерд╛ред рдпрд╣ рддрдм рдерд╛ рдЬрдм рдореИрдВрдиреЗ рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдерд╛, рд▓реЗрдХрд┐рди рдпрд╣ рдореЗрд░реЗ рдЗрдЪреНрдЫрд┐рдд рддрд░реАрдХреЗ рд╕реЗ рдХрд╛рдо рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рдерд╛: рдЖрдИрдПрд▓ рдХреЛрдб рдХреЗ рдмрдЬрд╛рдп, рдореИрдВрдиреЗ рд╕рд┐рд░реНрдл рдЯреЗрдХреНрд╕реНрдЯ рдлреЙрд░реНрдо рдореЗрдВ рд╕реА # рдХреЛрдб рдЙрддреНрдкрдиреНрди рдХрд┐рдпрд╛, рд╡рд┐рдзрд╛рдирд╕рднрд╛рдУрдВ рдХреЛ рдЕрдирд▓реЛрдб рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдФрд░ рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╡рд┐рд╢реНрд▓реЗрд╖рдгрд╛рддреНрдордХ рд░реВрдк рдореЗрдВ рдбреЗрд░рд┐рд╡реЗрдЯрд┐рд╡ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдирд╣реАрдВ рдерд╛ред рд▓реЗрдХрд┐рди рддрдм рдореИрдВ, рдЕрднреА рднреА рдЗрд╕ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдмреНрдпрд╛рдЬ рдмрдиреЗ рд░рд╣реЗред рдпрд╣ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐ рдЗрдВрдЯрд░рдиреЗрдЯ рдкрд░ рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдРрд╕реЗ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╣реИрдВ, рд▓реЗрдХрд┐рди рдХрд╣реАрдВ рднреА рдЖрдИрдПрд▓ рдХреЛрдб рдореЗрдВ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХреЗ рд╕рдВрдХрд▓рди рдХрд╛ рдЪрд░рдг рдирд╣реАрдВ рдорд┐рд▓рд╛ рд╣реИ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╣рд░ рдЬрдЧрд╣ рд╡реНрдпрд╛рдЦреНрдпрд╛ рд╣реИ, рдЬреЛ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рднрд╛рд╡реА рд░реВрдк рдореЗрдВ рд╕рдВрдХрд▓рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рд░реЛрдз рдирд╣реАрдВ рд╣реИ, рдорд╛рд░ рдбрд╛рд▓рд╛ред рдЦреИрд░, рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдореИрдВрдиреЗ рдЗрд╕реЗ рдЦреБрдж рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢реБрджреНрдз рд░реВрдк рд╕реЗ рд╡рд┐рдХрд╕рд┐рдд рдХрд┐рдпрд╛, рдирдИ рддрдХрдиреАрдХреЛрдВ рдХрд╛ рдЕрдзреНрдпрдпрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдпрд╣ рдЙрдореНрдореАрдж рдирд╣реАрдВ рдХрд░рддрд╛ рдХрд┐ рдореЗрд░реЗ рдХрд╛рдо рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХрд╣реАрдВ рд╣реЛ рд╕рдХрддреА рд╣реИред рдЕрдзреАрд░ рдХреЗ рд▓рд┐рдП: рд╕реНрд░реЛрдд рдХреЛрдб , рдХрд╛рд░реНрдпрдХреНрд░рдо ред

рдкреНрд░рдпреБрдХреНрдд рдХрд╛рд░реНрдпрдХреНрд░рдо рдФрд░ рдкреБрд╕реНрддрдХрд╛рд▓рдп


  1. рд╕реНрд╡рд░реНрдг рдкрд╛рд░реНрд╕рд┐рдВрдЧ рдкреНрд░рдгрд╛рд▓реА - рд╡реНрдпрд╛рдХрд░рдг рд▓рд┐рдЦрдиреЗ рдФрд░ рд╡рд┐рднрд┐рдиреНрди рднрд╛рд╖рд╛рдУрдВ (рд╕реА, рд╕реА #, рдЬрд╛рд╡рд╛, рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ, рдСрдмреНрдЬреЗрдХреНрдЯрд┐рд╡-рд╕реА, рдкрд░реНрд▓, рдкрд╛рдпрдерди, рд░реВрдмреА, рдЖрджрд┐) рдХреЗ рд▓рд┐рдП рд╡реНрдпрд╛рдХрд░рдг рдФрд░ рдкрд╛рд░реНрд╕рд░реНрд╕ рдХреЗ рд▓рд┐рдП рдХреЛрдб рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдИрдбреАрдИред LALR рдкрд╛рд░реНрд╕рд┐рдВрдЧ рдкрд░ рдЖрдзрд╛рд░рд┐рддред
  2. рджреГрд╢реНрдп рд╕реНрдЯреВрдбрд┐рдпреЛ 2010
  3. GOLD.Engine - рд╡рд┐рдзрд╛рдирд╕рднрд╛ рдиреЗрдЯ рдХреЗ рддрд╣рдд рдХрдиреЗрдХреНрд╢рди, рдЙрддреНрдкрдиреНрди рдХреА рдореЗрдЬ рдХреЗ рд╕рд╛рде рдмрд╛рддрдЪреАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред
  4. NUnit - рдУрдкрди рдкрд░реНрдпрд╛рд╡рд░рдг рдЗрдХрд╛рдИ рдиреЗрдЯ рдХреЗ рд▓рд┐рдП рдЖрд╡реЗрджрди рдкрддреНрд░ рдХрд╛ рдкрд░реАрдХреНрд╖рдгред
  5. ILSpy - .NET рдХреЗ рд▓рд┐рдП OpenSource disassemblerред

рдЪрд░рдг рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдореИрдВрдиреЗ рдкреВрд░реА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рддреЛрдбрд╝ рджрд┐рдпрд╛:
  1. рдПрдХ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд╡реГрдХреНрд╖ рдХрд╛ рдирд┐рд░реНрдорд╛рдг
  2. рд╡рд┐рд╢реНрд▓реЗрд╖рдгрд╛рддреНрдордХ рд╡реНрдпреБрддреНрдкрдиреНрди рдХреА рдЧрдгрдирд╛
  3. рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХрд╛ рд╕рд░рд▓реАрдХрд░рдг
  4. рддрд░реНрдХрд╕рдВрдЧрдд рдЕрдВрд╢ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг
  5. рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд╕рдВрдХрд▓рди


рдПрдХ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд╡реГрдХреНрд╖ рдХрд╛ рдирд┐рд░реНрдорд╛рдг


рдореИрдВрдиреЗ рдЧреЛрд▓реНрдб рдкрд╛рд░реНрд╕рд░ рдЬрдирд░реЗрдЯрд░ рдЪреБрдирд╛, рдХреНрдпреЛрдВрдХрд┐ рдореЗрд░реЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА ANTLR рдХреЗ рд╕рд╛рде рдЕрдиреБрднрд╡ рд╣реИ рдФрд░ рдореБрдЭреЗ рдХреБрдЫ рдирдпрд╛ рдЪрд╛рд╣рд┐рдП рдерд╛ред рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рдлрд╛рдпрджреЗ рдХреЛ рджреВрд╕рд░реЛрдВ рдХреЗ рд╕рд╛рде рддреБрд▓рдирд╛ рдореЗрдВ, рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдЗрд╕ рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ ред рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрдм ANTLR рдХреЗ рд╕рд╛рде рддреБрд▓рдирд╛ рдХреА рдЬрд╛рддреА рд╣реИ, рддреЛ GOLD рдПрд▓рдПрдПрд▓рдЖрд░ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИ, рдПрд▓рдПрд▓ рдирд╣реАрдВред рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реИ рдХрд┐, рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рдЙрддреНрдкрдиреНрди рдкрд╛рд░реНрд╕рд░ рддреЗрдЬрд╝ рдФрд░ рдЕрдзрд┐рдХ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рд╣реИ, рд▓реЗрдХрд┐рди рджреВрд╕рд░реА рдУрд░, рдЗрд╕реЗ рдбреАрдмрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ (рд╕реНрд╡рд░реНрдг рдореЗрдВ, рдлрд╝рд╛рдЗрд▓ рдХреЛ рдмрд╛рдЗрдирд░реА рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдбрд╛рдЙрдирд▓реЛрдб рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ), рдФрд░ рдпрджрд┐ рдпрд╣ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрдкреНрд░рдпреБрдХреНрдд рдФрд░ рдЕрд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реЛрдЧрд╛ ред рдПрдХ рдФрд░ рдмрдбрд╝рд╛ рдЕрдВрддрд░ рдПрдХ рд╡реНрдпрд╛рдХрд░рдг рдХрд╛рдо рдХреЗ рдЖрдХрд╛рд░ рд╣реИ: BNF , рдирд╣реАрдВ EBNF ред рдФрд░ рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реИ рдХрд┐ рдЗрд╕ рд░реВрдк рдореЗрдВ рджрд░реНрдЬ рд╡реНрдпрд╛рдХрд░рдг рдореЗрдВ рдХреЛрдг рдХреЛрд╖реНрдардХ, рдкрд░рд┐рднрд╛рд╖рд╛ рдХрд╛ рд╕рдВрдХреЗрдд рдФрд░ рд╕рд╢рд░реНрдд рдШрдЯрдирд╛рдУрдВ рдФрд░ рджреЛрд╣рд░рд╛рд╡ рдХреА рдЕрдиреБрдкрд╕реНрдерд┐рддрд┐ ( рд╡рд┐рдХреА рдореЗрдВ рдЕрдзрд┐рдХ) рдХреЗ рдЕрднрд╛рд╡ рдХреЗ рдХрд╛рд░рдг рдереЛрдбрд╝рд╛ рдмрдбрд╝рд╛ рдЖрдХрд╛рд░ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдИрдмреАрдПрдирдПрдл рдореЗрдВ рдРрд╕рд╛ рдирд┐рдпрдоред

ExpressionList = Expression { ',' Expression } 

рдЗрд╕ рд░реВрдк рдореЗрдВ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрд╛ рдЬрд╛рдПрдЧрд╛:

 <ExpressionList> ::= <ExpressionList> ',' <Expression> | <Expression> 

рддреЛ, рдЧрдгрд┐рддреАрдп рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХреЗ рдЕрдВрддрд┐рдо рд╡реНрдпрд╛рдХрд░рдг рдХреЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд░реВрдк рд╣реИрдВ:

рдЧрдгрд┐рддреАрдп рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХрд╛ рд╡реНрдпрд╛рдХрд░рдг
 "Name" = 'Mathematics expressions' "Author" = 'Ivan Kochurkin' "Version" = '1.0' "About" = '' "Case Sensitive" = False "Start Symbol" = <Statements> Id = {Letter}{AlphaNumeric}* Number1 = {Digit}+('.'{Digit}*('('{Digit}*')')?)? Number2 = '.'{Digit}*('('{Digit}*')')? AddLiteral = '+' | '-' MultLiteral = '*' | '/' <Statements> ::= <Statements> <Devider> <Statement> | <Statements> <Devider> | <Statement> <Devider> ::= ';' | '.' <Statement> ::= <Expression> '=' <Expression> | <Expression> <Expression> ::= <FuncDef> | <Addition> <FuncDef> ::= Id '(' <ExpressionList> ')' | Id '' '(' <ExpressionList> ')' | Id '(' <ExpressionList> ')' '' <ExpressionList> ::= <ExpressionList> ',' <Expression> | <Expression> <Addition> ::= <Addition> AddLiteral <Multiplication> | <Addition> AddLiteral <FuncDef> | <FuncDef> AddLiteral <Multiplication> | <FuncDef> AddLiteral <FuncDef> | <Multiplication> <Multiplication> ::= <Multiplication> MultLiteral <Exponentiation> | <Multiplication> MultLiteral <FuncDef> | <FuncDef> MultLiteral <Exponentiation> | <FuncDef> MultLiteral <FuncDef> | <Exponentiation> <Exponentiation> ::= <Exponentiation> '^' <Negation> | <Exponentiation> '^' <FuncDef> | <FuncDef> '^' <Negation> | <FuncDef> '^' <FuncDef> | <Negation> <Negation> ::= AddLiteral <Value> | AddLiteral <FuncDef> | <Value> <Value> ::= Id | Number1 | Number2 | '(' <Expression> ')' | '|' <Expression> '|' | '(' <Expression> ')' '' | '|' <Expression> '|' '' | Id '' 


рд╡реНрдпрд╛рдХрд░рдг рдореЗрдВ рд╕рдм рдХреБрдЫ рд╕реНрдкрд╖реНрдЯ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ, рдЯреЛрдХрди рдХреЛ рдЫреЛрдбрд╝рдХрд░: рдирдВрдмрд░ 1 = {рдЕрдВрдХ} + ('ред' {рдЕрдВрдХ} * ('(' {рдЕрдВрдХ} * ')')?)ред 0.1234 (56) рдПрдХ рддрд░реНрдХрд╕рдВрдЧрдд рдЕрдВрд╢ рд╣реИ рдХрд┐: 61111/495000 рдЗрд╕ рдбрд┐рдЬрд╛рдЗрди рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдлрд╛рд░реНрдо рдХреА рд▓рд╛рдЗрди рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдореИрдВ рдмрд╛рдж рдореЗрдВ рдЗрд╕ рддрд░рд╣ рдХреЗ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЛ рдПрдХ рдЕрдВрд╢ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░реВрдВрдЧрд╛ред

рдЗрд╕рд▓рд┐рдП, рд╕рдВрдХрд▓рд┐рдд рд╡реНрдпрд╛рдХрд░рдг рддрд╛рд▓рд┐рдХрд╛рдУрдВ (рд╕рдВрдХрд▓рд┐рдд рд╡реНрдпрд╛рдХрд░рдг рддрд╛рд▓рд┐рдХрд╛ рдлрд╝рд╛рдЗрд▓) рдЙрддреНрдкрдиреНрди рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж, рдФрд░ рдкрд╛рд░реНрд╕рд░ рд╡рд░реНрдЧ рд░реВрдкрд░реЗрдЦрд╛ рдмрдирд╛рдИ рдЬрд╛рддреА рд╣реИ, рдПрдХ рдЙрдкрдпреБрдХреНрдд рдПрдПрд╕рдЯреА рдкреЗрдбрд╝ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрддреНрддрд░рд╛рд░реНрджреНрдз рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдкрд╛рд░реНрд╕рд░ рдХреНрд▓рд╛рд╕ рдлреНрд░реЗрдорд╡рд░реНрдХ рдПрдХ .cs рдлрд╝рд╛рдЗрд▓ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд╡реНрдпрд╛рдХрд░рдг рдХреЗ рд╕рднреА рдирд┐рдпрдореЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдПрдХ рд▓реВрдк рд╣реЛрддрд╛ рд╣реИ, рдЯреЛрдХрди рдФрд░ рдЕрдиреНрдп рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рдЧрд▓рдд рдЕрдиреБрдХреНрд░рдо рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдЕрдкрд╡рд╛рдж рд╕реЗ рдирд┐рдкрдЯрдиреЗ (рд╡реИрд╕реЗ, рдЧреЛрд▓реНрдб рдореЗрдВ рднреА рдРрд╕реЗ рдлреНрд░реЗрдорд╡рд░реНрдХ рдХреЗ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЬрдирд░реЗрдЯрд░ рд╣реИрдВ, рдФрд░ рдореИрдВрдиреЗ Cook .NET рдХреЛ рдЪреБрдирд╛ рд╣реИред )ред рддреЛ, рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, "рдЙрдкрдпреБрдХреНрдд" рдХрд╛ рдЕрд░реНрде рд╣реИ рдПрдХ рдкреЗрдбрд╝ рдЬрд┐рд╕рдореЗрдВ рдиреЛрдбреНрд╕ рд╣реЛрддреЗ рд╣реИрдВ рдЬреЛ рдкреНрд░рдХрд╛рд░ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ:


рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рдиреЛрдбреНрд╕ рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЪрд┐рддреНрд░ рдореЗрдВ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ:


рдпрд╣ рд╡реНрдпрд╛рдХрд░рдг рд╕реЗ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдкрд░рд┐рдгрд╛рдореА рдкреЗрдбрд╝ рдХреЗ рдиреЛрдбреНрд╕ рдореЗрдВ рдпрд╛ рддреЛ рдХреЛрдИ рдмрдЪреНрдЪреЗ рдирд╣реАрдВ рд╣реИрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдорд╛рди рдпрд╛ рдЪрд░), рдпрд╛ рдорд╛рдирдХ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдПрдХ рд╕реЗ рджреЛ рдмрдЪреНрдЪреЗ рд╣реИрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХреЙрд╕, рдЬреЛрдбрд╝, рдШрд╛рддрд╛рдВрдХ)ред рдЕрдиреНрдп рд╕рднреА рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рдЕрдзрд┐рдХ рддрд░реНрдХ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЙрди рдкрд░ рд╡рд┐рдЪрд╛рд░ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ред

рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╕рднреА рдиреЛрдбреНрд╕ (рдпрд╛ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХреЗ рд╕рд╛рде рдиреЛрдбреНрд╕) 0 рд╕реЗ 2 рдмрдЪреНрдЪреЗ, рд╕рдорд╛рд╡реЗрд╢реА рд╣реИрдВред рдпрд╣ рдПрдХ рд╕реИрджреНрдзрд╛рдВрддрд┐рдХ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ рд╕рдЪ рд╣реИред рд▓реЗрдХрд┐рди рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдореИрдВ рд╕рдорд╛рд░реЛрд╣ рдХрд░рдирд╛ рдерд╛ "+" рдФрд░ "*" рдЖрджреЗрд╢ рд╕рд░рд▓реАрдХрд░рдг рдХрд╛ рдХрд╛рд░реНрдп рд╣реИ, рдЬреЛ рдмрд╛рдж рдореЗрдВ рдЪрд░реНрдЪрд╛ рдХреА рдЬрд╛рдПрдЧреА рдХреА рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП рдмрдЪреНрдЪреЛрдВ рдХреА рдПрдХ рдЕрд╕реАрдорд┐рдд рд╕рдВрдЦреНрдпрд╛ рд╣реИред рд╡реИрд╕реЗ, "-" рдФрд░ "/" рдЬреИрд╕реЗ рджреНрд╡рд┐рдЖрдзрд╛рд░реА рд╕рдВрдЪрд╛рд▓рди рдХреЛ рднреА рдЙрдиреНрд╣реАрдВ рдХрд╛рд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП рдЫреЛрдбрд╝рдирд╛ рдкрдбрд╝рд╛ (рд╡реЗ рд╕рд╣реА рдкрдХреНрд╖ рдХреА рдЙрдкреЗрдХреНрд╖рд╛ рдХреЗ рд╕рд╛рде рдФрд░ рджрд╛рд╣рд┐рдиреА рдУрд░ рдХреЗ рдЙрд▓рдЯ рдХреЗ рд╕рд╛рде рдЧреБрдгрд╛ рдХреЗ рд╕рд╛рде рдмрджрд▓ рджрд┐рдП рдЧрдП рдереЗ)ред

рддреЛ, рдкрд╛рд░реНрд╕рд┐рдВрдЧ рд╕реНрдЯреЗрдЬ рдкрд░, рдкреНрд░рддреНрдпреЗрдХ рдирд┐рдпрдо рдХреЗ рд▓рд┐рдП рд╕рднреА рдиреЛрдбреНрд╕ рдЧрд┐рд░ рдЬрд╛рддреЗ рд╣реИрдВ рдпрд╛ рдиреЛрдбреНрд╕ рдирд╛рдордХ рдмрдлрд░ рд╕реЗ рдкреБрдирд░реНрдкреНрд░рд╛рдкреНрдд рд╣реЛрддреЗ рд╣реИрдВред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдкреВрд░реА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рдЕрдВрдд рдореЗрдВ, рджрд╛рдПрдВ рдФрд░ рдмрд╛рдПрдВ рднрд╛рдЧреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдпрд╛ рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рдХрд╛рд░реНрдп рдЗрд╕ рдмрдлрд░ рдореЗрдВ рд░рд╣рддреЗ рд╣реИрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдкрд╛рд░реНрд╕рд┐рдВрдЧ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ, рддрд╛рдХрд┐ рдЬреЛрдбрд╝ рдФрд░ рдЧреБрдгрд╛ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рддреБрд░рдВрдд рдмрд╣реБрд░рд╛рд╖реНрдЯреНрд░реАрдп рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЕрддрд┐рд░рд┐рдХреНрдд рдмрдлрд╝рд░реНрд╕ ArgsCount рдФрд░ ArgsFuncTypes рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдЬреЛ рдХреНрд░рдорд╢рдГ рдлрд╝рдВрдХреНрд╢рди рдФрд░ рд╡рд░реНрддрдорд╛рди рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдкреНрд░рдХрд╛рд░ рдореЗрдВ рддрд░реНрдХреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЧреБрдгрди рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП, рдЗрд╕ рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:

рдкрд╣рд▓рд╛ рдЧреБрдгрдХ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг:

 // <Multiplication> ::= <Exponentiation> if (MultiplicationMultiChilds) PushFunc(KnownMathFunctionType.Mult); 

рдЖрдИ-рд╡реЗрдВ рдЧреБрдгрдХ рдХрд╛ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг:

 // <Multiplication> ::= <Multiplication> MultLiteral <Exponentiation> // <Multiplication> ::= <Multiplication> MultLiteral <FuncDef> if (KnownMathFunction.BinaryNamesFuncs[r[1].Data.ToString()] == KnownMathFunctionType.Div) Nodes.Push(new FuncNode(KnownMathFunctionType.Exp, new MathFuncNode[] { Nodes.Pop(), new ValueNode(-1) })); ArgsCount[ArgsCount.Count - 1]++; 

рдЕрдВрддрд┐рдо рдЧреБрдгрдХ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдирд╛:

 // <Addition> ::= <Multiplication> if (MultiplicationMultiChilds) PushOrRemoveFunc(KnownMathFunctionType.Mult); if (AdditionMultiChilds) PushFunc(KnownMathFunctionType.Add); 


рдЗрд╕ рдХреЛрдб рд╕реЗ, рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╢реВрдиреНрдп рддрддреНрд╡реЛрдВ рдХреЗ рд╕рд╛рде рдХреЛрдИ рдЧреБрдгрди рдФрд░ рдирд╣реАрдВ рдкрд┐рдЫрд▓реЗ рдЧреБрдгрд╛ рд╕рдорд╛рд░реЛрд╣ PushOrRemoveFunc рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдЕрдЧрд░ рд╣реИред рдЗрд╕реА рддрд░рд╣ рдХреА рдХрд╛рд░реНрд░рд╡рд╛рдЗрдпреЛрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИред

рдПрдХ рдЪрд░, рджреНрд╡рд┐рдЖрдзрд╛рд░реА рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рд╕реНрдерд┐рд░рд╛рдВрдХ, рдЪрд░ рдФрд░ рдорд╛рдиреЛрдВ рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рд╕рдВрд╕рд╛рдзрди рддреБрдЪреНрдЫ рд╣реИ, рдФрд░ рдХрд╣рд╛ рдХрд┐ рддреБрдо рд╕рдм MathExprParser.cs рдореЗрдВ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВред

рд╡рд┐рд╢реНрд▓реЗрд╖рдгрд╛рддреНрдордХ рд╡реНрдпреБрддреНрдкрдиреНрди рдХреА рдЧрдгрдирд╛


рдЗрд╕ рд╕реНрддрд░ рдкрд░, рдЖрдкрдХреЛ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдЗрд╕рдХреЗ рд╡реНрдпреБрддреНрдкрдиреНрди рдореЗрдВ рдмрджрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдкрд╣рд▓реЗ рдЪрд░рдг рд╕реЗ рдЬрд╛рдирддреЗ рд╣реИрдВ, рдирд┐рд░реНрдорд┐рдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЗ рдкреЗрдбрд╝ рдореЗрдВ рдХреЗрд╡рд▓ рдЪрд╛рд░ рдкреНрд░рдХрд╛рд░ рдХреЗ рдиреЛрдб рд╣реЛрддреЗ рд╣реИрдВ (рдкрд╛рдВрдЪрд╡реЗрдВ рдмрд╛рдж рдореЗрдВ рдкреНрд░рдХрдЯ рд╣реЛрддрд╛ рд╣реИ)ред рдЙрдирдХреЗ рд▓рд┐рдП, рд╣рдо рд╡реНрдпреБрддреНрдкрдиреНрди рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ:


рдореБрдЭреЗ рд╕рдордЭрд╛рдПрдВ: рд╡реНрдпреБрддреНрдкрдиреНрди рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдкрд╣рд▓реЗ рд╕реЗ рддреИрдпрд╛рд░ рд╕рд╛рд░рдгреАрдмрджреНрдз рдорд╛рди рд▓реЗрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдФрд░ рдпрд╣ рдХреБрдЫ рдХрдард┐рдирд╛рдЗрдпреЛрдВ рдХрд╛ рдХрд╛рд░рдг рдмрдирддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕ рдореВрд▓реНрдп рдХреЗ рдЕрдВрджрд░ рднреА рдбреЗрд░рд┐рд╡реЗрдЯрд┐рд╡ рд╣реИрдВ, рдЕрд░реНрдерд╛рддреНред рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдкреНрд░рдХреГрддрд┐ рдореЗрдВ рдкреБрдирд░рд╛рд╡рд░реНрддреА рд╣реИред рдЖрдк рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рд╕реНрдкреЙрдЗрд▓рд░ рдХреЗ рдиреАрдЪреЗ рдРрд╕реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрдиреЛрдВ рдХреА рдкреВрд░реА рд╕реВрдЪреА рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВред

рдбреЗрд░рд┐рд╡реЗрдЯрд┐рд╡ рдХреА рд╕реВрдЪреА
 (f(x) ^ g(x))' = f(x) ^ g(x) * (f(x)' * g(x) / f(x) + g(x)' * ln(f(x)));"); neg(f(x))' = neg(f(x)');"); sin(f(x))' = cos(f(x)) * f(x)'; cos(f(x))' = -sin(f(x)) * f(x)'; tan(f(x))' = f(x)' / cos(f(x)) ^ 2; cot(f(x))' = -f(x)' / sin(f(x)) ^ 2; arcsin(f(x))' = f(x)' / sqrt(1 - f(x) ^ 2); arccos(f(x))' = -f(x)' / sqrt(1 - f(x) ^ 2); arctan(f(x))' = f(x)' / (1 + f(x) ^ 2); arccot(f(x))' = -f(x)' / (1 + f(x) ^ 2); sinh(f(x))' = f(x)' * cosh(x); cosh(f(x))' = f(x)' * sinh(x); arcsinh(f(x))' = f(x)' / sqrt(f(x) ^ 2 + 1); arcosh(f(x))' = f(x)' / sqrt(f(x) ^ 2 - 1); ln(f(x))' = f(x)' / f(x); log(f(x), g(x))' = g'(x)/(g(x)*ln(f(x))) - (f'(x)*ln(g(x)))/(f(x)*ln(f(x))^2); 

рдпрд╣ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐ рд╕рднреА рдбреЗрд░рд┐рд╡реЗрдЯрд┐рд╡ рдХреЛрдб рдореЗрдВ рдХрдард┐рди рдирд╣реАрдВ рд▓рд┐рдЦреЗ рдЧрдП рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рднреА рджрд░реНрдЬ рдХрд┐рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдкрд╛рд░реНрд╕ рдХрд┐рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВред

рдЗрд╕ рд╕реВрдЪреА рдореЗрдВ рдХреЛрдИ рдЬреЛрдбрд╝ рдпрд╛ рдЧреБрдгрд╛ рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЬреИрд╕рд╛ рдХрд┐ рдКрдкрд░ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдпреЗ рдХрдИ рддрд░реНрдХреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рд░реНрдп рдХрд░рддреЗ рд╣реИрдВред рдФрд░ рдРрд╕реЗ рдирд┐рдпрдореЛрдВ рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдмрд╣реБрдд рд╕рд╛рд░реЗ рдХреЛрдб рд▓рд┐рдЦрдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реЛрдЧрд╛ред рд╕рдорд╛рди рдХрд╛рд░рдгреЛрдВ рд╕реЗ, рдХрд╛рд░реНрдпреЛрдВ рдХреА рдХреЛрдИ рд░рдЪрдирд╛ рдирд╣реАрдВ рд╣реИ, рдЕрд░реНрдерд╛рддреНред (рдПрдл (g (x))) '= рдЪ (g (x))' * g (x) ', рдФрд░ рдмрджрд▓реЗ рд╕рднреА рдХрд╛рд░реНрдпреЛрдВ рдХреА рд░рдЪрдирд╛ рдХреЗ рдХрд╛рд░реНрдп рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рдХрд░ рд░рд╣реЗ рд╣реИрдВред

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрджрд┐ рдлрдВрдХреНрд╢рди рдХреЛ рдбреЗрд░рд┐рд╡реЗрдЯрд┐рд╡реНрд╕ (рдпрд╛рдиреА рдПрдХ рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рдлрд╝рдВрдХреНрд╢рди) рдХреЗ рд▓рд┐рдП рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рдирд╣реАрдВ рдорд┐рд▓рд╛, рддреЛ рдпрд╣ рдХреЗрд╡рд▓ рдПрдХ рд╕реНрдЯреНрд░реЛрдХ рдХреЗ рд╕рд╛рде рдПрдХ рдлрд╝рдВрдХреНрд╢рди рджреНрд╡рд╛рд░рд╛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ: i.e. f (x) f (x) 'рдореЗрдВ рдмрджрд▓ рдЬрд╛рдПрдЧрд╛ред

рд╡рд┐рд╢реНрд▓реЗрд╖рдгрд╛рддреНрдордХ рд╡реНрдпреБрддреНрдкрдиреНрди рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдП рдЬрд╛рдиреЗ рдХреЗ рдмрд╛рдж, рд╕рдорд╕реНрдпрд╛ рдпрд╣ рдЙрдарддреА рд╣реИ рдХрд┐ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдореЗрдВ рдмрд╣реБрдд рд╕рд╛рд░рд╛ "рдХрдЪрд░рд╛" рд╣реИ, рдЬреИрд╕реЗ рдХрд┐ + 0, * 1 *, * a ^ -1, рдЗрддреНрдпрд╛рджрд┐ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреА рдЧрдгрдирд╛ рдЕрдзрд┐рдХ рдЗрд╖реНрдЯрддрдо рддрд░реАрдХреЗ рд╕реЗ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдПрдХ рдмрджрд╕реВрд░рдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдорд┐рд▓рддреА рд╣реИ:

 (x^2 + 2)' = 0 + 2 * 1 * x ^ 1 

рд╕рд░рд▓реАрдХрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдРрд╕реА рдХрдорд┐рдпреЛрдВ рдХреЛ рджреВрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХрд╛ рд╕рд░рд▓реАрдХрд░рдг


рдЗрд╕ рд╕реНрддрд░ рдкрд░, рдбреЗрд░рд┐рд╡реЗрдЯрд┐рд╡ рдХреА рдЧрдгрдирд╛ рдХреЗ рдЪрд░рдг рдХреЗ рд╡рд┐рдкрд░реАрдд, рдореИрдВрдиреЗ рдЙрдирдХреЗ рдмрд╛рдж рдХреЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд▓рдЧ рдЬрдЧрд╣ рдореЗрдВ рд╕рд╛рджрдЧреА рдХреЗ рдирд┐рдпрдореЛрдВ рдХреЛ рдирд╣реАрдВ рд▓рд┐рдЦрд╛, рдХреНрдпреЛрдВрдХрд┐ рдЬреЛрдбрд╝ рдФрд░ рдЧреБрдгрд╛ рдХрд╛ рдХрд╛рд░реНрдп рдХрдИ рддрд░реНрдХреЛрдВ рдХреЗ рдХрд╛рд░реНрдп рд╣реИрдВ, рдЬреЛ рдЗрд╕ рддрд░рд╣ рдХреЗ рдирд┐рдпрдореЛрдВ рдХреЛ рдмрдирд╛рдиреЗ рдореЗрдВ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдХрдард┐рдирд╛рдИ рдкреНрд░рд╕реНрддреБрдд рдХрд░рддрд╛ рд╣реИред рдПрдХ рдкреБрдирд░рд╛рд╡реГрддреНрдд рднрд╛рд╖рд╛ рдХрд╛ рд╕рдВрджрд░реНрднред

рд╡рд┐рд╖рдп рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ, рдореИрдВрдиреЗ рдЗрд╕ рд╡рд┐рд╖рдп рдкрд░ рдЫреБрдЖ рдХрд┐ рдХреНрдпреЛрдВ рдЬреЛрдбрд╝ рдФрд░ рдЧреБрдгрд╛ рдХреЛ рдПрди-рдЖрд░реНрдп рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рджрд░реНрд╢рд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред рдиреАрдЪреЗ рджреА рдЧрдИ рддрд╕реНрд╡реАрд░ рдореЗрдВ рджрд┐рдЦрд╛рдП рдЧрдП рд╕реНрдерд┐рддрд┐ рдХреА рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВред рдпрд╣рд╛рдБ рд╣рдо рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ a -a рд╕рдВрдХреНрд╖рд┐рдкреНрдд рд╣реИред рд▓реЗрдХрд┐рди рдмрд╛рдЗрдирд░реА рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдпрд╣ рдХреИрд╕реЗ рдХрд░реЗрдВ? рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдиреЛрдбреНрд╕ рдП , рдмреА, рдФрд░ рд╕реА рдкрд░ рдкреБрдирд░рд╛рд╡реГрддреНрдд рдХрд░реЗрдВ рддрд╛рдХрд┐ рдмрд╛рдж рдореЗрдВ рдкрддрд╛ рдЪрд▓реЗ рдХрд┐ рдП рдФрд░ -рдП рдПрдХ рд╣реА рдиреЛрдб рдХреЗ рдмрдЪреНрдЪреЗ рд╣реИрдВ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рд╡реЗ рдиреЛрдб рдХреЗ рд╕рд╛рде рдПрдХ рд╕рд╛рде рдХрдо рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди, рдЬрд╝рд╛рд╣рд┐рд░ рд╣реИ, рдкреЗрдбрд╝реЛрдВ рдХреЛ рдЫрд╛рдВрдЯрдирд╛ рдЗрддрдирд╛ рдЖрд╕рд╛рди рдХрд╛рдо рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдПрдХ рд╣реА рдмрд╛рд░ рдореЗрдВ рд╕рднреА рдмрдЪреНрдЪреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдЪрдХреНрд░ рдореЗрдВ рд╕рднреА рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЛ рдХрд░рдирд╛ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рджрд╛рдИрдВ рдУрд░ рдХреА рдЖрдХреГрддрд┐ рдореЗрдВ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред рд╡реИрд╕реЗ, рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рд╕рдВрд╢реНрд▓рд┐рд╖реНрдЯрддрд╛ рд╕реЗ рд╣рдореЗрдВ рд╕рдорд░реВрдкрддрд╛ рдФрд░ рд╕рдВрдпрдорддрд╛ рдХреЗ рдЧрдгрд┐рддреАрдп рдЧреБрдгреЛрдВ рдХреЛ рдмрдирд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдорд┐рд▓рддреА рд╣реИред


рд╕рд░рд▓реАрдХрд░рдг рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рджреМрд░рд╛рди, рджреЛ рдиреЛрдбреНрд╕ рдХреА рддреБрд▓рдирд╛ рдХрд░рдиреЗ рдореЗрдВ рд╕рдорд╕реНрдпрд╛ рдЙрддреНрдкрдиреНрди рд╣реЛрддреА рд╣реИ, рдЬреЛ рдмрджрд▓реЗ рдореЗрдВ, рдЪрд╛рд░ рдкреНрд░рдХрд╛рд░реЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реЛ рд╕рдХрддреА рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдкрд╛рдк (x + y) рдФрд░ -sin (x + y) рдЬреИрд╕реЗ рднрд╛рд╡реЛрдВ рдХреЛ рдХрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рд╣реИред рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рдЖрдк рдиреЛрдбреНрд╕ рджреНрд╡рд╛рд░рд╛ рд╕реНрд╡рдпрдВ рдФрд░ рдЙрдирдХреЗ рд╕рднреА рд╡рдВрд╢реЛрдВ рдХреА рддреБрд▓рдирд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рд╡рд┐рдзрд┐ рдЙрд╕ рд╕реНрдерд┐рддрд┐ рдХрд╛ рд╕рд╛рдордирд╛ рдирд╣реАрдВ рдХрд░реЗрдЧреА рдЬрдм рд╢рд░реНрддреЛрдВ рдпрд╛ рдХрд╛рд░рдХреЛрдВ рдХреЛ рдлрд┐рд░ рд╕реЗ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдкрд╛рдк (x + y) рдФрд░ -sin (y + x)ред рдХреНрд░рдорд╡рд┐рдирд┐рдореЗрдпрддрд╛ (рдЬреИрд╕реЗ рдХрд┐, рдЬреЛрдбрд╝ рдФрд░ рдШрдЯрд╛рд╡) рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╢рдмреНрджреЛрдВ рдпрд╛ рдХрд╛рд░рдХреЛрдВ presorting рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред рдиреЛрдбреНрд╕ рдХреА рддреБрд▓рдирд╛ рдиреАрдЪреЗ рдЪрд┐рддреНрд░ рдореЗрдВ рджрд┐рдЦрд╛рдИ рдЧрдИ рд╣реИ, рдЕрд░реНрдерд╛рдд рдорд╛рди рд╕реНрдерд┐рд░рд╛рдВрдХ рд╕реЗ рдХрдо рд╣реИрдВ, рд╕реНрдерд┐рд░рд╛рдВрдХ рдЪрд░ рд╕реЗ рдХрдо рд╣реИрдВ, рдЖрджрд┐ред рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХреЗ рд▓рд┐рдП, рд╕рдм рдХреБрдЫ рдереЛрдбрд╝рд╛ рдФрд░ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдХреЛ рди рдХреЗрд╡рд▓ рдЙрдирдХреЗ рдирд╛рдореЛрдВ рдХреА рддреБрд▓рдирд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдмрд▓реНрдХрд┐ рддрд░реНрдХреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдФрд░ рд╕реНрд╡рдпрдВ рддрд░реНрдХ рднреАред


рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдЙрдкрд░реЛрдХреНрдд рд╕рднреА рд░реВрдкрд╛рдВрддрд░рдгреЛрдВ рдФрд░ рдЧрдгрдирд╛рдУрдВ рдХреЗ рдмрд╛рдж, рдореВрд▓ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХрд╛рдлреА рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рд╕рд░рд▓ рд╣реЛ рдЧрдИ рд╣реИред

рддрд░реНрдХрд╕рдВрдЧрдд рдЕрдВрд╢ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг


рдореБрдЭреЗ рдЬреЛ рддрд░реНрдХрд╕рдВрдЧрдд рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдорд┐рд▓рд╛, рдЙрд╕рдореЗрдВ рд╕рд╛рдорд╛рдиреНрдп рд╕реНрдЯреНрд░рд┐рдВрдЧ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдХреЛрдИ рд░реВрдкрд╛рдВрддрд░рдг рдирд╣реАрдВ рдерд╛, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП 0.666666, рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЕрдВрд╢ рдФрд░ рд╣рд░ рдХреЗ рд╕рд╛рде рдПрдХ рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рдореЗрдВ, рдЕрд░реНрдерд╛рддреНред рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╕рдЯреАрдХрддрд╛ рдХреЗ рд╕рд╛рде 2/3 рдореЗрдВред рдлрд┐рд░ рдореИрдВрдиреЗ рдЕрдкрдиреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдмрд╣реБрдд рд╕рд╛рд░реЗ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЗ рд╕рд╛рде рд▓рд┐рдЦрдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рдХрд╛рд░реНрдп рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╕рдВрдЦреНрдпрд╛ рд╡рд┐рд╢реБрджреНрдз рд░реВрдк рд╕реЗ рдЕрдкрд░рд┐рдореЗрдп рд╣реИ, рдпрд╛ рдХреНрдпрд╛ рдЗрд╕рдХреА рдЕрд╡рдзрд┐ рдпрд╛ рдкрд░рд┐рдорд┐рдд рдЕрдВрд╢ рд╣реИ рдФрд░ рдЗрд╕реЗ рдПрдХ рдкрд░рд┐рдореЗрдп рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдкрд╛рдк (pi) рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╕рдЯреАрдХрддрд╛ рдХреЗ рд╕рд╛рдеред рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, stackoverflow.com рдХреЗ рдореЗрд░реЗ рдЙрддреНрддрд░ рдореЗрдВ рдЕрдиреНрдп рд╡рд┐рд╡рд░рдг рджреЗрдЦреЗрдВред рд╡рд┐рдзрд┐ рдХрд╛ рдПрдХ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдЪрд┐рддреНрд░рдордп рд╡рд┐рд╡рд░рдг рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рдЪрд┐рддреНрд░ рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рдХреЛрдб рдиреАрдЪреЗ рд╕реВрдЪреА рдореЗрдВ рд╣реИред рдпрд╣ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐, рдлрд┐рд░ рднреА, рдорд╛рдирдХ рдЧрдгрд┐рддреАрдп рдХрд╛рд░реНрдпреЛрдВ рдХреА рд╕рдЯреАрдХрддрд╛ рдФрд░ рджреЛрд╣рд░реЗ рдкреНрд░рдХрд╛рд░ рддрд░реНрдХрд╕рдВрдЧрдд рдФрд░ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреА рд╕рд╛рдорд╛рдиреНрдп рдорд╛рдиреНрдпрддрд╛ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рд╕реИрджреНрдзрд╛рдВрддрд┐рдХ рд░реВрдк рд╕реЗ рд╕рдм рдХреБрдЫ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред


рджрд╢рдорд▓рд╡ рдХреЛ рдЕрдВрд╢ рдореЗрдВ рдмрджрд▓реЗрдВ
 /// <summary> /// Convert decimal to fraction /// </summary> /// <param name="value">decimal value to convert</param> /// <param name="result">result fraction if conversation is succsess</param> /// <param name="decimalPlaces">precision of considereation frac part of value</param> /// <param name="trimZeroes">trim zeroes on the right part of the value or not</param> /// <param name="minPeriodRepeat">minimum period repeating</param> /// <param name="digitsForReal">precision for determination value to real if period has not been founded</param> /// <returns></returns> public static bool FromDecimal(decimal value, out Rational<T> result, int decimalPlaces = 28, bool trimZeroes = false, decimal minPeriodRepeat = 2, int digitsForReal = 9) { var valueStr = value.ToString("0.0000000000000000000000000000", CultureInfo.InvariantCulture); var strs = valueStr.Split('.'); long intPart = long.Parse(strs[0]); string fracPartTrimEnd = strs[1].TrimEnd(new char[] { '0' }); string fracPart; if (trimZeroes) { fracPart = fracPartTrimEnd; decimalPlaces = Math.Min(decimalPlaces, fracPart.Length); } else fracPart = strs[1]; result = new Rational<T>(); try { string periodPart; bool periodFound = false; int i; for (i = 0; i < fracPart.Length; i++) { if (fracPart[i] == '0' && i != 0) continue; for (int j = i + 1; j < fracPart.Length; j++) { periodPart = fracPart.Substring(i, j - i); periodFound = true; decimal periodRepeat = 1; decimal periodStep = 1.0m / periodPart.Length; var upperBound = Math.Min(fracPart.Length, decimalPlaces); int k; for (k = i + periodPart.Length; k < upperBound; k += 1) { if (periodPart[(k - i) % periodPart.Length] != fracPart[k]) { periodFound = false; break; } periodRepeat += periodStep; } if (!periodFound && upperBound - k <= periodPart.Length && periodPart[(upperBound - i) % periodPart.Length] > '5') { var ind = (k - i) % periodPart.Length; var regroupedPeriod = (periodPart.Substring(ind) + periodPart.Remove(ind)).Substring(0, upperBound - k); ulong periodTailPlusOne = ulong.Parse(regroupedPeriod) + 1; ulong fracTail = ulong.Parse(fracPart.Substring(k, regroupedPeriod.Length)); if (periodTailPlusOne == fracTail) periodFound = true; } if (periodFound && periodRepeat >= minPeriodRepeat) { result = FromDecimal(strs[0], fracPart.Substring(0, i), periodPart); break; } else periodFound = false; } if (periodFound) break; } if (!periodFound) { if (fracPartTrimEnd.Length >= digitsForReal) return false; else { result = new Rational<T>(long.Parse(strs[0]), 1, false); if (fracPartTrimEnd.Length != 0) result = new Rational<T>(ulong.Parse(fracPartTrimEnd), TenInPower(fracPartTrimEnd.Length)); return true; } } return true; } catch { return false; } } public static Rational<T> FromDecimal(string intPart, string fracPart, string periodPart) { Rational<T> firstFracPart; if (fracPart != null && fracPart.Length != 0) { ulong denominator = TenInPower(fracPart.Length); firstFracPart = new Rational<T>(ulong.Parse(fracPart), denominator); } else firstFracPart = new Rational<T>(0, 1, false); Rational<T> secondFracPart; if (periodPart != null && periodPart.Length != 0) secondFracPart = new Rational<T>(ulong.Parse(periodPart), TenInPower(fracPart.Length)) * new Rational<T>(1, Nines((ulong)periodPart.Length), false); else secondFracPart = new Rational<T>(0, 1, false); var result = firstFracPart + secondFracPart; if (intPart != null && intPart.Length != 0) { long intPartLong = long.Parse(intPart); result = new Rational<T>(intPartLong, 1, false) + (intPartLong == 0 ? 1 : Math.Sign(intPartLong)) * result; } return result; } private static ulong TenInPower(int power) { ulong result = 1; for (int l = 0; l < power; l++) result *= 10; return result; } private static decimal TenInNegPower(int power) { decimal result = 1; for (int l = 0; l > power; l--) result /= 10.0m; return result; } private static ulong Nines(ulong power) { ulong result = 9; if (power >= 0) for (ulong l = 0; l < power - 1; l++) result = result * 10 + 9; return result; } = /// <summary> /// Convert decimal to fraction /// </summary> /// <param name="value">decimal value to convert</param> /// <param name="result">result fraction if conversation is succsess</param> /// <param name="decimalPlaces">precision of considereation frac part of value</param> /// <param name="trimZeroes">trim zeroes on the right part of the value or not</param> /// <param name="minPeriodRepeat">minimum period repeating</param> /// <param name="digitsForReal">precision for determination value to real if period has not been founded</param> /// <returns></returns> public static bool FromDecimal(decimal value, out Rational<T> result, int decimalPlaces = 28, bool trimZeroes = false, decimal minPeriodRepeat = 2, int digitsForReal = 9) { var valueStr = value.ToString("0.0000000000000000000000000000", CultureInfo.InvariantCulture); var strs = valueStr.Split('.'); long intPart = long.Parse(strs[0]); string fracPartTrimEnd = strs[1].TrimEnd(new char[] { '0' }); string fracPart; if (trimZeroes) { fracPart = fracPartTrimEnd; decimalPlaces = Math.Min(decimalPlaces, fracPart.Length); } else fracPart = strs[1]; result = new Rational<T>(); try { string periodPart; bool periodFound = false; int i; for (i = 0; i < fracPart.Length; i++) { if (fracPart[i] == '0' && i != 0) continue; for (int j = i + 1; j < fracPart.Length; j++) { periodPart = fracPart.Substring(i, j - i); periodFound = true; decimal periodRepeat = 1; decimal periodStep = 1.0m / periodPart.Length; var upperBound = Math.Min(fracPart.Length, decimalPlaces); int k; for (k = i + periodPart.Length; k < upperBound; k += 1) { if (periodPart[(k - i) % periodPart.Length] != fracPart[k]) { periodFound = false; break; } periodRepeat += periodStep; } if (!periodFound && upperBound - k <= periodPart.Length && periodPart[(upperBound - i) % periodPart.Length] > '5') { var ind = (k - i) % periodPart.Length; var regroupedPeriod = (periodPart.Substring(ind) + periodPart.Remove(ind)).Substring(0, upperBound - k); ulong periodTailPlusOne = ulong.Parse(regroupedPeriod) + 1; ulong fracTail = ulong.Parse(fracPart.Substring(k, regroupedPeriod.Length)); if (periodTailPlusOne == fracTail) periodFound = true; } if (periodFound && periodRepeat >= minPeriodRepeat) { result = FromDecimal(strs[0], fracPart.Substring(0, i), periodPart); break; } else periodFound = false; } if (periodFound) break; } if (!periodFound) { if (fracPartTrimEnd.Length >= digitsForReal) return false; else { result = new Rational<T>(long.Parse(strs[0]), 1, false); if (fracPartTrimEnd.Length != 0) result = new Rational<T>(ulong.Parse(fracPartTrimEnd), TenInPower(fracPartTrimEnd.Length)); return true; } } return true; } catch { return false; } } public static Rational<T> FromDecimal(string intPart, string fracPart, string periodPart) { Rational<T> firstFracPart; if (fracPart != null && fracPart.Length != 0) { ulong denominator = TenInPower(fracPart.Length); firstFracPart = new Rational<T>(ulong.Parse(fracPart), denominator); } else firstFracPart = new Rational<T>(0, 1, false); Rational<T> secondFracPart; if (periodPart != null && periodPart.Length != 0) secondFracPart = new Rational<T>(ulong.Parse(periodPart), TenInPower(fracPart.Length)) * new Rational<T>(1, Nines((ulong)periodPart.Length), false); else secondFracPart = new Rational<T>(0, 1, false); var result = firstFracPart + secondFracPart; if (intPart != null && intPart.Length != 0) { long intPartLong = long.Parse(intPart); result = new Rational<T>(intPartLong, 1, false) + (intPartLong == 0 ? 1 : Math.Sign(intPartLong)) * result; } return result; } private static ulong TenInPower(int power) { ulong result = 1; for (int l = 0; l < power; l++) result *= 10; return result; } private static decimal TenInNegPower(int power) { decimal result = 1; for (int l = 0; l > power; l--) result /= 10.0m; return result; } private static ulong Nines(ulong power) { ulong result = 9; if (power >= 0) for (ulong l = 0; l < power - 1; l++) result = result * 10 + 9; return result; } , CultureInfo.InvariantCulture); /// <summary> /// Convert decimal to fraction /// </summary> /// <param name="value">decimal value to convert</param> /// <param name="result">result fraction if conversation is succsess</param> /// <param name="decimalPlaces">precision of considereation frac part of value</param> /// <param name="trimZeroes">trim zeroes on the right part of the value or not</param> /// <param name="minPeriodRepeat">minimum period repeating</param> /// <param name="digitsForReal">precision for determination value to real if period has not been founded</param> /// <returns></returns> public static bool FromDecimal(decimal value, out Rational<T> result, int decimalPlaces = 28, bool trimZeroes = false, decimal minPeriodRepeat = 2, int digitsForReal = 9) { var valueStr = value.ToString("0.0000000000000000000000000000", CultureInfo.InvariantCulture); var strs = valueStr.Split('.'); long intPart = long.Parse(strs[0]); string fracPartTrimEnd = strs[1].TrimEnd(new char[] { '0' }); string fracPart; if (trimZeroes) { fracPart = fracPartTrimEnd; decimalPlaces = Math.Min(decimalPlaces, fracPart.Length); } else fracPart = strs[1]; result = new Rational<T>(); try { string periodPart; bool periodFound = false; int i; for (i = 0; i < fracPart.Length; i++) { if (fracPart[i] == '0' && i != 0) continue; for (int j = i + 1; j < fracPart.Length; j++) { periodPart = fracPart.Substring(i, j - i); periodFound = true; decimal periodRepeat = 1; decimal periodStep = 1.0m / periodPart.Length; var upperBound = Math.Min(fracPart.Length, decimalPlaces); int k; for (k = i + periodPart.Length; k < upperBound; k += 1) { if (periodPart[(k - i) % periodPart.Length] != fracPart[k]) { periodFound = false; break; } periodRepeat += periodStep; } if (!periodFound && upperBound - k <= periodPart.Length && periodPart[(upperBound - i) % periodPart.Length] > '5') { var ind = (k - i) % periodPart.Length; var regroupedPeriod = (periodPart.Substring(ind) + periodPart.Remove(ind)).Substring(0, upperBound - k); ulong periodTailPlusOne = ulong.Parse(regroupedPeriod) + 1; ulong fracTail = ulong.Parse(fracPart.Substring(k, regroupedPeriod.Length)); if (periodTailPlusOne == fracTail) periodFound = true; } if (periodFound && periodRepeat >= minPeriodRepeat) { result = FromDecimal(strs[0], fracPart.Substring(0, i), periodPart); break; } else periodFound = false; } if (periodFound) break; } if (!periodFound) { if (fracPartTrimEnd.Length >= digitsForReal) return false; else { result = new Rational<T>(long.Parse(strs[0]), 1, false); if (fracPartTrimEnd.Length != 0) result = new Rational<T>(ulong.Parse(fracPartTrimEnd), TenInPower(fracPartTrimEnd.Length)); return true; } } return true; } catch { return false; } } public static Rational<T> FromDecimal(string intPart, string fracPart, string periodPart) { Rational<T> firstFracPart; if (fracPart != null && fracPart.Length != 0) { ulong denominator = TenInPower(fracPart.Length); firstFracPart = new Rational<T>(ulong.Parse(fracPart), denominator); } else firstFracPart = new Rational<T>(0, 1, false); Rational<T> secondFracPart; if (periodPart != null && periodPart.Length != 0) secondFracPart = new Rational<T>(ulong.Parse(periodPart), TenInPower(fracPart.Length)) * new Rational<T>(1, Nines((ulong)periodPart.Length), false); else secondFracPart = new Rational<T>(0, 1, false); var result = firstFracPart + secondFracPart; if (intPart != null && intPart.Length != 0) { long intPartLong = long.Parse(intPart); result = new Rational<T>(intPartLong, 1, false) + (intPartLong == 0 ? 1 : Math.Sign(intPartLong)) * result; } return result; } private static ulong TenInPower(int power) { ulong result = 1; for (int l = 0; l < power; l++) result *= 10; return result; } private static decimal TenInNegPower(int power) { decimal result = 1; for (int l = 0; l > power; l--) result /= 10.0m; return result; } private static ulong Nines(ulong power) { ulong result = 9; if (power >= 0) for (ulong l = 0; l < power - 1; l++) result = result * 10 + 9; return result; } , regroupedPeriod.Length)); /// <summary> /// Convert decimal to fraction /// </summary> /// <param name="value">decimal value to convert</param> /// <param name="result">result fraction if conversation is succsess</param> /// <param name="decimalPlaces">precision of considereation frac part of value</param> /// <param name="trimZeroes">trim zeroes on the right part of the value or not</param> /// <param name="minPeriodRepeat">minimum period repeating</param> /// <param name="digitsForReal">precision for determination value to real if period has not been founded</param> /// <returns></returns> public static bool FromDecimal(decimal value, out Rational<T> result, int decimalPlaces = 28, bool trimZeroes = false, decimal minPeriodRepeat = 2, int digitsForReal = 9) { var valueStr = value.ToString("0.0000000000000000000000000000", CultureInfo.InvariantCulture); var strs = valueStr.Split('.'); long intPart = long.Parse(strs[0]); string fracPartTrimEnd = strs[1].TrimEnd(new char[] { '0' }); string fracPart; if (trimZeroes) { fracPart = fracPartTrimEnd; decimalPlaces = Math.Min(decimalPlaces, fracPart.Length); } else fracPart = strs[1]; result = new Rational<T>(); try { string periodPart; bool periodFound = false; int i; for (i = 0; i < fracPart.Length; i++) { if (fracPart[i] == '0' && i != 0) continue; for (int j = i + 1; j < fracPart.Length; j++) { periodPart = fracPart.Substring(i, j - i); periodFound = true; decimal periodRepeat = 1; decimal periodStep = 1.0m / periodPart.Length; var upperBound = Math.Min(fracPart.Length, decimalPlaces); int k; for (k = i + periodPart.Length; k < upperBound; k += 1) { if (periodPart[(k - i) % periodPart.Length] != fracPart[k]) { periodFound = false; break; } periodRepeat += periodStep; } if (!periodFound && upperBound - k <= periodPart.Length && periodPart[(upperBound - i) % periodPart.Length] > '5') { var ind = (k - i) % periodPart.Length; var regroupedPeriod = (periodPart.Substring(ind) + periodPart.Remove(ind)).Substring(0, upperBound - k); ulong periodTailPlusOne = ulong.Parse(regroupedPeriod) + 1; ulong fracTail = ulong.Parse(fracPart.Substring(k, regroupedPeriod.Length)); if (periodTailPlusOne == fracTail) periodFound = true; } if (periodFound && periodRepeat >= minPeriodRepeat) { result = FromDecimal(strs[0], fracPart.Substring(0, i), periodPart); break; } else periodFound = false; } if (periodFound) break; } if (!periodFound) { if (fracPartTrimEnd.Length >= digitsForReal) return false; else { result = new Rational<T>(long.Parse(strs[0]), 1, false); if (fracPartTrimEnd.Length != 0) result = new Rational<T>(ulong.Parse(fracPartTrimEnd), TenInPower(fracPartTrimEnd.Length)); return true; } } return true; } catch { return false; } } public static Rational<T> FromDecimal(string intPart, string fracPart, string periodPart) { Rational<T> firstFracPart; if (fracPart != null && fracPart.Length != 0) { ulong denominator = TenInPower(fracPart.Length); firstFracPart = new Rational<T>(ulong.Parse(fracPart), denominator); } else firstFracPart = new Rational<T>(0, 1, false); Rational<T> secondFracPart; if (periodPart != null && periodPart.Length != 0) secondFracPart = new Rational<T>(ulong.Parse(periodPart), TenInPower(fracPart.Length)) * new Rational<T>(1, Nines((ulong)periodPart.Length), false); else secondFracPart = new Rational<T>(0, 1, false); var result = firstFracPart + secondFracPart; if (intPart != null && intPart.Length != 0) { long intPartLong = long.Parse(intPart); result = new Rational<T>(intPartLong, 1, false) + (intPartLong == 0 ? 1 : Math.Sign(intPartLong)) * result; } return result; } private static ulong TenInPower(int power) { ulong result = 1; for (int l = 0; l < power; l++) result *= 10; return result; } private static decimal TenInNegPower(int power) { decimal result = 1; for (int l = 0; l > power; l--) result /= 10.0m; return result; } private static ulong Nines(ulong power) { ulong result = 9; if (power >= 0) for (ulong l = 0; l < power - 1; l++) result = result * 10 + 9; return result; } 


рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд╕рдВрдХрд▓рди


рд╕рд╛рджрдЧреА рдХреЗ рдЪрд░рдг рдХреЗ рдмрд╛рдж рдкрд░рд┐рдгрд╛рдореА рдЕрд░реНрде рд╡реГрдХреНрд╖ рдХреЛ IL рдХреЛрдб рдореЗрдВ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ Mono.Cecil рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ред

рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ, рдПрдХ рдЕрд╕реЗрдВрдмрд▓реА, рд╡рд░реНрдЧ рдФрд░ рд╡рд┐рдзрд┐ рдмрдирд╛рдИ рдЬрд╛рддреА рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдХрдорд╛рдВрдб рд▓рд┐рдЦреЗ рдЬрд╛рдПрдВрдЧреЗред рдлрд┐рд░, рдкреНрд░рддреНрдпреЗрдХ рдлрд╝рдирдХреЛрдб рдХреЗ рд▓рд┐рдП, рдпрд╣ рдЧрдгрдирд╛ рдХреА рдЬрд╛рддреА рд╣реИ рдХрд┐ рдпрд╣ рдХрд╛рд░реНрдпрдХреНрд░рдо рдореЗрдВ рдХрд┐рддрдиреА рдмрд╛рд░ рджрд┐рдЦрд╛рдИ рджреЗрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдХреЛрдИ рдлрд╝рдВрдХреНрд╢рди рдкрд╛рдк (x ^ 2) * cos (x ^ 2) рд╣реИ , рддреЛ рдЗрд╕рдореЗрдВ x рдХреЛ 2 рдХреА рд╢рдХреНрддрд┐ рддрдХ рдмрдврд╝рд╛рдиреЗ рдХрд╛ рдХрд╛рд░реНрдп рджреЛ рдмрд╛рд░ рд╣реЛрддрд╛ рд╣реИ, рдФрд░ рдлрд╝рдВрдХреНрд╢рди sin рдФрд░ cos - one at aред рдмрд╛рдж рдореЗрдВ, рджрд░ рдЧрдгрдирд╛ рд╕рдорд╛рд░реЛрд╣ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рддрд░реАрдХреЗ (рдЕрд░реНрдерд╛рдд, рдЬрд┐рд╕рд╕реЗ рджреВрд╕рд░реА рдмрд╛рд░ рдПрдХ рд╣реА рд╕рдорд╛рд░реЛрд╣ рдЬрдЧрд╣ рдирд╣реАрдВ рд▓реЗ рдХрд░рддрд╛ рд╣реИ рдХреА рдЧрдгрдирд╛) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ:

 if (!func.Calculated) { EmitFunc(funcNode); func.Calculated = true; } else IlInstructions.Add(new OpCodeArg(OpCodes.Ldloc, funcNode.Number)); 


рдЗрд╕ рд╕рднреА рдХреЛрдб рдХреЛ рдЬрдирд░реЗрдЯ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, IL рдХреЛрдб рдХреА рдХреБрдЫ рдЕрдиреНрдп рдЕрдиреБрдХреВрд▓рди рд╕рдВрднрд╡ рд╣реИрдВ, рдЬреИрд╕рд╛ рдХрд┐ рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рдЪрд┐рддреНрд░ рдореЗрдВ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред

рдЗрд╕ рддрд╕реНрд╡реАрд░ рдореЗрдВ:
  1. Ldarg - рд╕реНрдЯреИрдХ рдкрд░ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдлрд╝рдВрдХреНрд╢рди рддрд░реНрдХ рд▓реЛрдб рдХрд░рдиреЗ рдХрд╛ рд╕рдВрдЪрд╛рд▓рдиред
  2. Ldc_R8 - рд╕реНрдЯреИрдХ рдкрд░ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдбрдмрд▓ рдорд╛рди рд▓реЛрдб рд╣реЛ рд░рд╣рд╛ рд╣реИред
  3. Stloc.n - рд╕реНрдЯреИрдХ рд╕реЗ рдЕрдВрддрд┐рдо рдорд╛рди рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ рдФрд░ рдЗрд╕реЗ рд╕реНрдерд╛рдиреАрдп рдЪрд░ n рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░реЗрдВред
  4. Ldloc.n - рд╕реНрдЯреИрдХ рдкрд░ рд╕реНрдерд╛рдиреАрдп рдЪрд░ n рдХреЛ рдзрдХреНрдХрд╛ рджреЗрдирд╛ ред

рдпрджрд┐ рдХреБрдЫ рд╢рд░реНрддреЛрдВ рдХреЛ рдкреВрд░рд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдмреЗрдЬ рдмреЙрдХреНрд╕ рдХреЗ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЛ рд╣рдЯрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдКрдкрд░реА рдмрд╛рдИрдВ рдЫрд╡рд┐ рдореЗрдВ рдорд╛рдорд▓рд╛ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд╡рд░реНрдгрд┐рдд рд╣реИ: рдпрджрд┐ рд╡рд░реНрддрдорд╛рди рдирд┐рд░реНрджреЗрд╢ рдХрд┐рд╕реА рдлрд╝рдВрдХреНрд╢рди рд╕реЗ рдПрдХ рддрд░реНрдХ рд▓реЛрдб рдХрд░ рд░рд╣рд╛ рд╣реИ рдпрд╛ рдПрдХ рдирд┐рд░рдВрддрд░ рд▓реЛрдб рд╣реЛ рд░рд╣рд╛ рд╣реИ, рдФрд░ рдЕрдЧрд▓рд╛ рдирд┐рд░реНрджреЗрд╢ рдЗрд╕реЗ рд╕реНрдерд╛рдиреАрдп рдЪрд░ n рдореЗрдВ рд╕рд╣реЗрдЬ рд░рд╣рд╛ рд╣реИ, рддреЛ рд▓реЛрдбрд┐рдВрдЧ рдХреЗ рд╕рд╛рде рд╕реНрдерд╛рдиреАрдп рдЪрд░ n рдХреЗ рд▓реЛрдб рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдХреЗ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЗ рдЗрд╕ рдмреНрд▓реЙрдХ рдХреЛ рд╣рдЯрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдлрд╝рдВрдХреНрд╢рди рддрд░реНрдХ рдпрд╛ рдирд┐рд░рдВрддрд░ рд▓реЛрдб рд╣реЛ рд░рд╣рд╛ рд╣реИред рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рддрдм рддрдХ рдЬрд╛рд░реА рд░рдЦреЗрдВ рдЬрдм рддрдХ рдХрд┐ рд╕реНрдерд╛рдиреАрдп рд╡реЗрд░рд┐рдПрдмрд▓ n рдореЗрдВ рдкрд╣рд▓рд╛ рд╕реЗрд╡ рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рди рд╣реЛ рдЬрд╛рдП ред рдЕрдиреНрдп рддреАрди рдорд╛рдорд▓реЛрдВ рдХреЛ рдЗрд╕реА рддрд░рд╣ рд╕реЗ рд╕рдордЭрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЕрдиреБрдХреНрд░рдо Ldloc.n ; Stloc.n рдХреЛ рддреБрд░рдВрдд рд╣рдЯрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдпрд╣ рдзреНрдпрд╛рди рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдбреЗрдЯрд╛ рдЕрдиреБрдХреВрд▓рди рдХреЛрдб рдореЗрдВ рд╢рд╛рдЦрд╛рдУрдВ рдХреЗ рдЕрднрд╛рд╡ рдореЗрдВ рд▓рд╛рдЧреВ рд╣реЛрддреЗ рд╣реИрдВ, рдФрд░ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХреНрдпреЛрдВ (рдЕрдЧрд░ рдХрд╛рдлреА рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ, рдореИрдВ рд╕реЛрдЪ рд╕реБрдЭрд╛рд╡ рд╣реИ)ред рд▓реЗрдХрд┐рди рдЪреВрдВрдХрд┐ рдЧрдгрд┐рддреАрдп рдХреНрд░рд┐рдпрд╛рдУрдВ рдФрд░ рдЙрдирдХреЗ рд╡реНрдпреБрддреНрдкрдиреНрди рдХреЗ рдХреЛрдб рдореЗрдВ рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдЪрдХреНрд░ рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддреЗ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рд╕рдм рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

рддреЗрдЬреА рд╕реЗ рдШрд╛рддрд╛рдВрдХ

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдПрдХ рд╢рдХреНрддрд┐ рдХреЛ рдЬрд▓реНрджреА рд╕реЗ рдмрдврд╝рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд▓рдЧрднрдЧ рд╕рднреА рдЬрд╛рдирддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдЗрд╕ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЗ рдиреАрдЪреЗ рд╕рдВрдХрд▓рди рд╕реНрддрд░ рдкрд░ рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:
рдЖрдИрдПрд▓ рдХреЛрдб рдореЗрдВ рддреЗрдЬреА рд╕реЗ рдШрд╛рддрд╛рдВрдХ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛
 if (power <= 3) { IlInstructions.Add(new OpCodeArg(OpCodes.Stloc, funcNode.Number)); IlInstructions.Add(new OpCodeArg(OpCodes.Ldloc, funcNode.Number)); for (int i = 1; i < power; i++) { IlInstructions.Add(new OpCodeArg(OpCodes.Ldloc, funcNode.Number)); IlInstructions.Add(new OpCodeArg(OpCodes.Mul)); } } else if (power == 4) { IlInstructions.Add(new OpCodeArg(OpCodes.Stloc, funcNode.Number)); IlInstructions.Add(new OpCodeArg(OpCodes.Ldloc, funcNode.Number)); IlInstructions.Add(new OpCodeArg(OpCodes.Ldloc, funcNode.Number)); IlInstructions.Add(new OpCodeArg(OpCodes.Mul)); IlInstructions.Add(new OpCodeArg(OpCodes.Stloc, funcNode.Number)); IlInstructions.Add(new OpCodeArg(OpCodes.Ldloc, funcNode.Number)); IlInstructions.Add(new OpCodeArg(OpCodes.Ldloc, funcNode.Number)); IlInstructions.Add(new OpCodeArg(OpCodes.Mul)); } else { // result: funcNode.Number // x: funcNode.Number + 1 //int result = x; IlInstructions.Add(new OpCodeArg(OpCodes.Stloc, funcNode.Number + 1)); IlInstructions.Add(new OpCodeArg(OpCodes.Ldloc, funcNode.Number + 1)); power--; do { if ((power & 1) == 1) { IlInstructions.Add(new OpCodeArg(OpCodes.Ldloc, funcNode.Number + 1)); IlInstructions.Add(new OpCodeArg(OpCodes.Mul)); } if (power <= 1) break; //x = x * x; IlInstructions.Add(new OpCodeArg(OpCodes.Ldloc, funcNode.Number + 1)); IlInstructions.Add(new OpCodeArg(OpCodes.Ldloc, funcNode.Number + 1)); IlInstructions.Add(new OpCodeArg(OpCodes.Mul)); IlInstructions.Add(new OpCodeArg(OpCodes.Stloc, funcNode.Number + 1)); power = power >> 1; } while (power != 0); } + if (power <= 3) { IlInstructions.Add(new OpCodeArg(OpCodes.Stloc, funcNode.Number)); IlInstructions.Add(new OpCodeArg(OpCodes.Ldloc, funcNode.Number)); for (int i = 1; i < power; i++) { IlInstructions.Add(new OpCodeArg(OpCodes.Ldloc, funcNode.Number)); IlInstructions.Add(new OpCodeArg(OpCodes.Mul)); } } else if (power == 4) { IlInstructions.Add(new OpCodeArg(OpCodes.Stloc, funcNode.Number)); IlInstructions.Add(new OpCodeArg(OpCodes.Ldloc, funcNode.Number)); IlInstructions.Add(new OpCodeArg(OpCodes.Ldloc, funcNode.Number)); IlInstructions.Add(new OpCodeArg(OpCodes.Mul)); IlInstructions.Add(new OpCodeArg(OpCodes.Stloc, funcNode.Number)); IlInstructions.Add(new OpCodeArg(OpCodes.Ldloc, funcNode.Number)); IlInstructions.Add(new OpCodeArg(OpCodes.Ldloc, funcNode.Number)); IlInstructions.Add(new OpCodeArg(OpCodes.Mul)); } else { // result: funcNode.Number // x: funcNode.Number + 1 //int result = x; IlInstructions.Add(new OpCodeArg(OpCodes.Stloc, funcNode.Number + 1)); IlInstructions.Add(new OpCodeArg(OpCodes.Ldloc, funcNode.Number + 1)); power--; do { if ((power & 1) == 1) { IlInstructions.Add(new OpCodeArg(OpCodes.Ldloc, funcNode.Number + 1)); IlInstructions.Add(new OpCodeArg(OpCodes.Mul)); } if (power <= 1) break; //x = x * x; IlInstructions.Add(new OpCodeArg(OpCodes.Ldloc, funcNode.Number + 1)); IlInstructions.Add(new OpCodeArg(OpCodes.Ldloc, funcNode.Number + 1)); IlInstructions.Add(new OpCodeArg(OpCodes.Mul)); IlInstructions.Add(new OpCodeArg(OpCodes.Stloc, funcNode.Number + 1)); power = power >> 1; } while (power != 0); } + if (power <= 3) { IlInstructions.Add(new OpCodeArg(OpCodes.Stloc, funcNode.Number)); IlInstructions.Add(new OpCodeArg(OpCodes.Ldloc, funcNode.Number)); for (int i = 1; i < power; i++) { IlInstructions.Add(new OpCodeArg(OpCodes.Ldloc, funcNode.Number)); IlInstructions.Add(new OpCodeArg(OpCodes.Mul)); } } else if (power == 4) { IlInstructions.Add(new OpCodeArg(OpCodes.Stloc, funcNode.Number)); IlInstructions.Add(new OpCodeArg(OpCodes.Ldloc, funcNode.Number)); IlInstructions.Add(new OpCodeArg(OpCodes.Ldloc, funcNode.Number)); IlInstructions.Add(new OpCodeArg(OpCodes.Mul)); IlInstructions.Add(new OpCodeArg(OpCodes.Stloc, funcNode.Number)); IlInstructions.Add(new OpCodeArg(OpCodes.Ldloc, funcNode.Number)); IlInstructions.Add(new OpCodeArg(OpCodes.Ldloc, funcNode.Number)); IlInstructions.Add(new OpCodeArg(OpCodes.Mul)); } else { // result: funcNode.Number // x: funcNode.Number + 1 //int result = x; IlInstructions.Add(new OpCodeArg(OpCodes.Stloc, funcNode.Number + 1)); IlInstructions.Add(new OpCodeArg(OpCodes.Ldloc, funcNode.Number + 1)); power--; do { if ((power & 1) == 1) { IlInstructions.Add(new OpCodeArg(OpCodes.Ldloc, funcNode.Number + 1)); IlInstructions.Add(new OpCodeArg(OpCodes.Mul)); } if (power <= 1) break; //x = x * x; IlInstructions.Add(new OpCodeArg(OpCodes.Ldloc, funcNode.Number + 1)); IlInstructions.Add(new OpCodeArg(OpCodes.Ldloc, funcNode.Number + 1)); IlInstructions.Add(new OpCodeArg(OpCodes.Mul)); IlInstructions.Add(new OpCodeArg(OpCodes.Stloc, funcNode.Number + 1)); power = power >> 1; } while (power != 0); } + if (power <= 3) { IlInstructions.Add(new OpCodeArg(OpCodes.Stloc, funcNode.Number)); IlInstructions.Add(new OpCodeArg(OpCodes.Ldloc, funcNode.Number)); for (int i = 1; i < power; i++) { IlInstructions.Add(new OpCodeArg(OpCodes.Ldloc, funcNode.Number)); IlInstructions.Add(new OpCodeArg(OpCodes.Mul)); } } else if (power == 4) { IlInstructions.Add(new OpCodeArg(OpCodes.Stloc, funcNode.Number)); IlInstructions.Add(new OpCodeArg(OpCodes.Ldloc, funcNode.Number)); IlInstructions.Add(new OpCodeArg(OpCodes.Ldloc, funcNode.Number)); IlInstructions.Add(new OpCodeArg(OpCodes.Mul)); IlInstructions.Add(new OpCodeArg(OpCodes.Stloc, funcNode.Number)); IlInstructions.Add(new OpCodeArg(OpCodes.Ldloc, funcNode.Number)); IlInstructions.Add(new OpCodeArg(OpCodes.Ldloc, funcNode.Number)); IlInstructions.Add(new OpCodeArg(OpCodes.Mul)); } else { // result: funcNode.Number // x: funcNode.Number + 1 //int result = x; IlInstructions.Add(new OpCodeArg(OpCodes.Stloc, funcNode.Number + 1)); IlInstructions.Add(new OpCodeArg(OpCodes.Ldloc, funcNode.Number + 1)); power--; do { if ((power & 1) == 1) { IlInstructions.Add(new OpCodeArg(OpCodes.Ldloc, funcNode.Number + 1)); IlInstructions.Add(new OpCodeArg(OpCodes.Mul)); } if (power <= 1) break; //x = x * x; IlInstructions.Add(new OpCodeArg(OpCodes.Ldloc, funcNode.Number + 1)); IlInstructions.Add(new OpCodeArg(OpCodes.Ldloc, funcNode.Number + 1)); IlInstructions.Add(new OpCodeArg(OpCodes.Mul)); IlInstructions.Add(new OpCodeArg(OpCodes.Stloc, funcNode.Number + 1)); power = power >> 1; } while (power != 0); } + if (power <= 3) { IlInstructions.Add(new OpCodeArg(OpCodes.Stloc, funcNode.Number)); IlInstructions.Add(new OpCodeArg(OpCodes.Ldloc, funcNode.Number)); for (int i = 1; i < power; i++) { IlInstructions.Add(new OpCodeArg(OpCodes.Ldloc, funcNode.Number)); IlInstructions.Add(new OpCodeArg(OpCodes.Mul)); } } else if (power == 4) { IlInstructions.Add(new OpCodeArg(OpCodes.Stloc, funcNode.Number)); IlInstructions.Add(new OpCodeArg(OpCodes.Ldloc, funcNode.Number)); IlInstructions.Add(new OpCodeArg(OpCodes.Ldloc, funcNode.Number)); IlInstructions.Add(new OpCodeArg(OpCodes.Mul)); IlInstructions.Add(new OpCodeArg(OpCodes.Stloc, funcNode.Number)); IlInstructions.Add(new OpCodeArg(OpCodes.Ldloc, funcNode.Number)); IlInstructions.Add(new OpCodeArg(OpCodes.Ldloc, funcNode.Number)); IlInstructions.Add(new OpCodeArg(OpCodes.Mul)); } else { // result: funcNode.Number // x: funcNode.Number + 1 //int result = x; IlInstructions.Add(new OpCodeArg(OpCodes.Stloc, funcNode.Number + 1)); IlInstructions.Add(new OpCodeArg(OpCodes.Ldloc, funcNode.Number + 1)); power--; do { if ((power & 1) == 1) { IlInstructions.Add(new OpCodeArg(OpCodes.Ldloc, funcNode.Number + 1)); IlInstructions.Add(new OpCodeArg(OpCodes.Mul)); } if (power <= 1) break; //x = x * x; IlInstructions.Add(new OpCodeArg(OpCodes.Ldloc, funcNode.Number + 1)); IlInstructions.Add(new OpCodeArg(OpCodes.Ldloc, funcNode.Number + 1)); IlInstructions.Add(new OpCodeArg(OpCodes.Mul)); IlInstructions.Add(new OpCodeArg(OpCodes.Stloc, funcNode.Number + 1)); power = power >> 1; } while (power != 0); } 


рдпрд╣ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐ рддреЗрдЬ рдШрд╛рддрд╛рдВрдХ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рд╕рдмрд╕реЗ рдЗрд╖реНрдЯрддрдо рдкреНрд░рддрд┐рдкрд╛рджрдХ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдирд╣реАрдВ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рджреЛ рддрд░реАрдХреЛрдВ рд╕реЗ рдкрд╛рдВрдЪ рдмрд╛рд░ рд╕рдорд╛рди рдЪрд░ рдХрд╛ рдЧреБрдгрди рд╣реИред рдореЗрд░реЗ рд▓рд┐рдП рднреА x ^ 4 + x ^ 3 + x ^ 2 + x = x * (x * (x * 1) + 1) + 1) рдЬреИрд╕реЗ рдЕрдиреБрдХреВрд▓рди рднреА рд▓рд╛рдЧреВ рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВред



рд╡реИрд╕реЗ, рдпрд╣ рдЙрд▓реНрд▓реЗрдЦ рдХреЗ рд▓рд╛рдпрдХ рд╣реИ рдХрд┐ рд╕рд╛рдорд╛рдиреНрдп рдирд┐рд╢реНрдЪрд┐рдд рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд▓рд┐рдП рдбрдмрд▓, рдЙрдкрд░реЛрдХреНрдд рдЧреБрдгрди рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд▓рдЧ рдХреНрд░рдо рдореЗрдВ рдЧреБрдгрд╛ рдХрд░рдиреЗ рдХрд╛ рдкрд░рд┐рдгрд╛рдо рдЕрд▓рдЧ рд╣реЛрдЧрд╛ (рдпрд╛рдиреА (рдП ^ 2) ^ 2 * рдП ^ 2! = (рдП ^ 3) ^ 2! )ред рдФрд░ рдЗрд╕ рд╡рдЬрд╣ рд╕реЗ, рдХреБрдЫ рд╕рдВрдХрд▓рдХ рдЗрдирдореЗрдВ рд╕реЗ рдХрдИ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХрд╛ рдЕрдиреБрдХреВрд▓рди рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рд╕реНрдЯреИрдХрдУрд╡рд░рд▓реЙрдлрд╝ рдореЗрдВ рджрд┐рд▓рдЪрд╕реНрдк рдХреНрдпреВ рдПрдВрдб рдП рд╣реИрдВ: рдЬреАрд╕реАрд╕реА рдПрдХ рдП * рдП * рдП * рдП * рдЯреВ (рдП * рдП * рдП) * (рдП * рдП * рдП) рдХрд╛ рдЕрдиреБрдХреВрд▓рди рдХреНрдпреЛрдВ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ? рдФрд░ рдХреНрдпреЛрдВ Math.Pow (x, 2) x * x рди рддреЛ рд╕рдВрдХрд▓рдХ рдФрд░ рди рд╣реА JIT рдХреЗ рд▓рд┐рдП рдЕрдиреБрдХреВрд▓рд┐рдд рд╣реИ? ред

рд╕реНрдерд╛рдиреАрдп рдЪрд░ рдЕрдиреБрдХреВрд▓рди

рдЬреИрд╕рд╛ рдХрд┐ рдкрд┐рдЫрд▓реЗ рдЪрд░рдгреЛрдВ рд╕реЗ рдЬреНрдЮрд╛рдд рд╣реИ, рд╕реНрдерд╛рдиреАрдп рдЪрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдЙрди рд╕рднреА рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬреЛ рдореВрд▓ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдореЗрдВ 1 рд╕реЗ рдЕрдзрд┐рдХ рдмрд╛рд░ рд╣реЛрддреЗ рд╣реИрдВред рд╕реНрдерд╛рдиреАрдп рдЪрд░ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдХреЗрд╡рд▓ рджреЛ рд╕рд░рд▓ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ: рд╕реНрдЯрд╛рд▓реЛрдХ рдФрд░ рдПрд▓рдбрд▓реЛрдХ , рдЬреЛ рдПрдХ рддрд░реНрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рдЗрд╕ рд╕реНрдерд╛рдиреАрдп рдЪрд░ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИред рд▓реЗрдХрд┐рди рдЕрдЧрд░ рд╣рд░ рдмрд╛рд░ рджреЛрд╣рд░рд╛рдпрд╛ рдЧрдгрдирд╛ рдкрд░рд┐рдгрд╛рдо (рдЗрд╕реЗ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП) рдореЗрдВ рдПрдХ рд╕реНрдерд╛рдиреАрдп рдЪрд░ рдХреА рд╕рдВрдЦреНрдпрд╛ рдмрдврд╝рд╛рдИ рдЬрд╛рддреА рд╣реИ, рддреЛ рдмрд╣реБрдд рд╕рд╛рд░реЗ рд╕реНрдерд╛рдиреАрдп рдЪрд░ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рдХрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╕реНрдерд╛рдиреАрдп рдЪрд░ рдХреЗ рдЬреАрд╡рди рдЪрдХреНрд░ рдХреЛ рд╕рдВрдкреАрдбрд╝рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЬрд┐рд╕рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдиреАрдЪреЗ рдХреА рдЖрдХреГрддрд┐ рдореЗрдВ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдореЗрдВ 5 рд╕реНрдерд╛рдиреАрдп рдЪрд░ рдХреЗ рдмрдЬрд╛рдп, рдЖрдк рдХреЗрд╡рд▓ 3 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрд╣ "рд▓рд╛рд▓рдЪреА" рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рд╕рдмрд╕реЗ рдЗрд╖реНрдЯрддрдо рдХреНрд░рдордЪрдп рдирд╣реАрдВ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрд╣ рдХрд╛рд░реНрдп рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рдлреА рдЙрдкрдпреБрдХреНрдд рд╣реИред

рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд╛рд░реНрдпреЛрдВ рдФрд░ рдЙрдирдХреЗ рдбреЗрд░рд┐рд╡реЗрдЯрд┐рд╡ рдХрд╛ рд╕рдВрдХрд▓рди

рд╡рд┐рдХрд╕рд┐рдд рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореЗрдВ, рдЖрдк рди рдХреЗрд╡рд▓ рдлреЙрд░реНрдо f (x) рдХреЗ рдПрдХ рдЪрд░ рдХреЗ рд╕рд░рд▓ рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдмрд▓реНрдХрд┐ рдЕрдиреНрдп рднреА, рдЬреИрд╕реЗ рдХрд┐ f (x, a, b (x)), рдЬрд╣рд╛рдВ рдПрдХ рдЕрдЬреНрдЮрд╛рдд рд╕реНрдерд┐рд░рд╛рдВрдХ рд╣реИ рдФрд░ b (x) рдПрдХ рдЕрдЬреНрдЮрд╛рдд рдХрд╛рд░реНрдп рд╣реИ рдПрдХ рдкреНрд░рддрд┐рдирд┐рдзрд┐ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░реЗрд╖рд┐рддред рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ, рдХрд┐рд╕реА рднреА рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╡реНрдпреБрддреНрдкрдиреНрди рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ: b (x) '= (b (x + dx) - b (x)) / dxред рдФрд░ рдЬрдм рд╕рдВрдХрд▓рди рдореЙрдбреНрдпреВрд▓ рдПрдХ рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИ:
 ldarg.1 ldarg.0 callvirt TResult System.Func`2<System.Double,System.Double>::Invoke(T) ret 

рдЕрдирд┐рд╢реНрдЪрд┐рдд рд╕рдорд╛рд░реЛрд╣ рдХреЗ рд╡реНрдпреБрддреНрдкрдиреНрди рдХреА рдЧрдгрдирд╛ рдХреЗ рд▓рд┐рдП рдХреЛрдб (dx = 0.000001)
 ldarg.1 ldarg.0 ldc.r8 1E-06 add callvirt TResult System.Func`2<System.Double,System.Double>::Invoke(T) ldarg.1 ldarg.0 callvirt TResult System.Func`2<System.Double,System.Double>::Invoke(T) sub ldc.r8 0.000001 div ret 


рд╡реНрдпреБрддреНрдкрдиреНрди рдХреА рд╕рдВрдЦреНрдпрд╛рддреНрдордХ рдЧрдгрдирд╛ рдХреЗ рд▓рд┐рдП, рдЖрдк рдЕрдиреНрдп, рдЕрдзрд┐рдХ рд╕рдЯреАрдХ рддрд░реАрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ ред



рдкрд░реАрдХреНрд╖рдг


рдкрд░реАрдХреНрд╖рдг рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рдХрдИ рдЪрд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП рдЖрдпреЛрдЬрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЬрд┐рд╕реЗ MathFunction.Tests рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рджрд┐рд▓рдЪрд╕реНрдк рдмрд┐рдВрджреБрдУрдВ рдореЗрдВ рд╕реЗ, рдПрдХ рд╡рд┐рд╢реНрд▓реЗрд╖рдгрд╛рддреНрдордХ рдбреЗрд░рд┐рд╡реЗрдЯрд┐рд╡ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдФрд░ рдбреЛрдореЗрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрд╕реЗрдВрдмрд▓рд┐рдпреЛрдВ рдХреЛ рд▓реЛрдб рдХрд░рдиреЗ рдФрд░ рдЕрдирд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡реБрд▓реНрдлреНрд░реЗрдордПрд▓реНрдлрд╛.рдиреЗрдЯ рдХреЗ рдЙрдкрдпреЛрдЧ рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд░ рд╕рдХрддрд╛ рд╣реИ ред

рд╡реЙрд▓рдлреНрд░реЗрдо рдЕрд▓реНрдлрд╛

WolframAlpha.NET рдкреНрд░рд╕рд┐рджреНрдз рдЧрдгрд┐рдд рд╕реЗрд╡рд╛ wolframalpha рдХреЗ рд▓рд┐рдП рдПрдХ рдПрдкреАрдЖрдИ рдЖрд╡рд░рдг рд╣реИ ред рдореЗрд░реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ, рдореЗрд░реЗ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреНрд░рд╛рдкреНрдд рд╡реНрдпреБрддреНрдкрдиреНрди рдХреЗ рд╕рд╛рде рдЗрд╕ рд╕реЗрд╡рд╛ рдкрд░ рдкреНрд░рд╛рдкреНрдд рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╕рд╣реА рд╡реНрдпреБрддреНрдкрдиреНрди рдХреА рддреБрд▓рдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рдХрд╛рдо рдореЗрдВ рдЖрдпрд╛ред рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:

 public static bool CheckDerivative(string expression, string derivative) { return CheckEquality("diff(" + expression + ")", derivative); } public static bool CheckEquality(string expression1, string expression2) { WolframAlpha wolfram = new WolframAlpha(ConfigurationManager.AppSettings["WolframAlphaAppId"]); string query = "(" + expression1.Replace(" ", "") + ")-(" + expression2.Replace(" ", "") + ")"; QueryResult result = wolfram.Query(query); result.RecalculateResults(); try { double d; return double.TryParse(result.GetPrimaryPod().SubPods[0].Plaintext, out d) && d == 0.0; } catch { return false; } } 


рдбреЛрдореЗрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрд╕реЗрдВрдмрд▓реА рдбрд╛рдЙрдирд▓реЛрдб рдФрд░ рдЕрдкрд▓реЛрдб рдХрд░реЗрдВ

рдПрдХ рдбреЛрдореЗрди рдмрдирд╛рдирд╛, рдПрдХ рдлрд╝рд╛рдЗрд▓ рд╕реЗ рдЕрд╕реЗрдВрдмрд▓ рдХрд░рдирд╛, рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рдирд╛ рдФрд░ рддрд░реАрдХреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд╕рд╛рде рдСрдмреНрдЬреЗрдХреНрдЯ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ (MethodInfo):

 Domain = AppDomain.CreateDomain("MathFuncDomain"); MathFuncObj = _domain.CreateInstanceFromAndUnwrap(FileName, NamespaceName + "." + ClassName); Type mathFuncObjType = _mathFuncObj.GetType(); Func = mathFuncObjType.GetMethod(FuncName); FuncDerivative = mathFuncObjType.GetMethod(FuncDerivativeName); 


рд╕рдВрдХрд▓рд┐рдд рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХреА рдЧрдгрдирд╛:
 return (double)Func.Invoke(_mathFuncObj, new object[] { x }) 


рдбреЛрдореЗрди рдХреЛ рд▓реЛрдб рдХрд░рдирд╛ рдФрд░ рдЕрд╕реЗрдВрдмрд▓реА рдлрд╝рд╛рдЗрд▓ рдХреЛ рд╣рдЯрд╛рдирд╛:
 if (_domain != null) AppDomain.Unload(Domain); File.Delete(FileName); 


рдЙрддреНрдкрдиреНрди рдЖрдИрдПрд▓ рдХреЛрдб рдХреА рддреБрд▓рдирд╛

рдЕрдВрддрд┐рдо IL рдХреЛрдб рд░рд┐рд▓реАрдЬрд╝ рдореЛрдб рдореЗрдВ рдорд╛рдирдХ C # рд╕рдВрдХрд▓рдХ csc.exe рджреНрд╡рд╛рд░рд╛ рдЙрддреНрдкрдиреНрди рдХреЛрдб рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рдЗрд╖реНрдЯрддрдо рд╣реИ, рдмрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП, рдирд┐рдореНрди рджреЛ рд╕реВрдЪрд┐рдпреЛрдВ рдХреА рддреБрд▓рдирд╛ рджреЗрдЦреЗрдВ
 x ^ 3 + sin(3 * ln(x * 1)) + x ^ ln(2 * sin(3 * ln(x))) - 2 * x ^ 3 

csc.exe .NET 4.5.1MathExpressions.NET
 IL_0000: ldarg.0 IL_0001: ldarg.0 IL_0002: mul IL_0003: ldarg.0 IL_0004: mul IL_0005: ldc.r8 3 IL_000e: ldarg.0 IL_000f: ldc.r8 1 IL_0018: mul IL_0019: call float64 [mscorlib]System.Math::Log(float64) IL_001e: mul IL_001f: call float64 [mscorlib]System.Math::Sin(float64) IL_0024: add IL_0025: ldarg.0 IL_0026: ldc.r8 2 IL_002f: ldc.r8 3 IL_0038: ldarg.0 IL_0039: call float64 [mscorlib]System.Math::Log(float64) IL_003e: mul IL_003f: call float64 [mscorlib]System.Math::Sin(float64) IL_0044: mul IL_0045: call float64 [mscorlib]System.Math::Log(float64) IL_004a: call float64 [mscorlib]System.Math::Pow(float64, float64) IL_004f: add IL_0050: ldc.r8 2 IL_0059: ldarg.0 IL_005a: mul IL_005b: ldarg.0 IL_005c: mul IL_005d: ldarg.0 IL_005e: mul IL_005f: sub IL_0060: ret 

 IL_0000: ldc.r8 3 IL_0009: ldarg.0 IL_000a: call float64 [mscorlib]System.Math::Log(float64) IL_000f: mul IL_0010: call float64 [mscorlib]System.Math::Sin(float64) IL_0015: stloc.0 IL_0016: ldloc.0 IL_0017: ldarg.0 IL_0018: ldarg.0 IL_0019: mul IL_001a: ldarg.0 IL_001b: mul IL_001c: sub IL_001d: ldarg.0 IL_001e: ldc.r8 2 IL_0027: ldloc.0 IL_0028: mul IL_0029: call float64 [mscorlib]System.Math::Log(float64) IL_002e: call float64 [mscorlib]System.Math::Pow(float64, float64) IL_0033: add IL_0034: ret 


рдЗрд╕реА рд╕рдордп, рдпрд╣ рджреЗрдЦрдирд╛ рджрд┐рд▓рдЪрд╕реНрдк рд╣реИ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ ILSpy рдореЗрдВ рдПрдХ рд╕реА рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдЕрд╕рдВрддреБрд╖реНрдЯ рд╕реА # рдХреЛрдб рдХрд╛ рдкрд░рд┐рдгрд╛рдо рджреЗрддрд╛ рд╣реИ рдЬреЛ рдЙрдкрд░реЛрдХреНрдд рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рд╡реНрдпреБрддреНрдкрдиреНрди рд╣реИ, рдЕрд░реНрдерд╛рддреНред рдХреЛ
 (ln(2 * sin(3 * ln(x))) * x ^ -1 + 3 * ln(x) * cos(3 * ln(x)) * sin(3 * ln(x)) ^ -1 * x ^ -1) * x ^ ln(2 * sin(3 * ln(x))) + 3 * cos(3 * ln(x)) * x ^ -1 + -(3 * x ^ 2) 

 double arg_24_0 = 2.0; double arg_1A_0 = 3.0; double num = Math.Log(x); double num2 = arg_1A_0 * num; double num3 = Math.Sin(num2); double num4 = Math.Log(arg_24_0 * num3); double arg_3B_0 = num4; double num5 = 1.0 / x; double arg_54_0 = arg_3B_0 * num5; double arg_4F_0 = 3.0 * num; num = Math.Cos(num2); return (arg_54_0 + arg_4F_0 * num / num3 * num5) * Math.Pow(x, num4) + num * num5 * 3.0 - x * x * 3.0; 

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдкрд╣рд▓реЗ рд╕реЗ рдЧрдгрдирд╛ рдХрд┐рдП рдЧрдП рдлрд╝рдВрдХреНрд╢рди рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рд╕реНрдерд╛рдиреАрдп рдЪрд░ рдмрдирд╛рдП рдЧрдП рд╣реИрдВред рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╡рд╛рд╕реНрддрд╡рд┐рдХрддрд╛ рдореЗрдВ рдХрдо рд╕реНрдерд╛рдиреАрдп рдЪрд░ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдбрдмрд▓ arg_24_0 = 2.0 рдХреЗ рд▓рд┐рдП; рдПрдХ рд╕реНрдерд╛рдиреАрдп рдЪрд░ рдирд╣реАрдВ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдпрд╣ рд╕рд┐рд░реНрдл рдПрдХ рд╕реНрдерд┐рд░ рд╣реИред

рдмреЗрд╢рдХ, рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдореЗрдВ рдРрд╕реЗ рднрд╛рд╡ рдмрд╣реБрдд рдХрдо рдкрд╛рдП рдЬрд╛рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди, рдлрд┐рд░ рднреА, рд╡рд░реНрдгрд┐рдд рдЕрдиреБрдХреВрд▓рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдЕрдиреНрдп, рдЕрдзрд┐рдХ рд▓рд╛рдЧреВ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдФрд░ рд╕рдВрдХрд▓рдХ рдХреА рдмреЗрд╣рддрд░ рд╕рдордЭ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдирд┐рд╖реНрдХрд░реНрд╖


рдЙрдкрд░реЛрдХреНрдд рд╕рднреА рдХреЛ C # рдореЗрдВ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рджреМрд░рд╛рди, рдореИрдВрдиреЗ рдорд╣рд╕реВрд╕ рдХрд┐рдпрд╛ рдХрд┐ рдПрдХ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рднрд╛рд╖рд╛ рдЙрди рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рдЙрдкрдпреБрдХреНрдд рд╣реИ рдЬрд╣рд╛рдБ рдЖрдкрдХреЛ рдкреНрд░рддреАрдХрд╛рддреНрдордХ рдЧрдгрдирд╛ рдФрд░ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдХреБрдЫ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдУрдкрдирд╕реЛрд░реНрд╕ рдореИрдХреНрд╕рд┐рдорд╛ рдХрдВрдкреНрдпреВрдЯрд░ рдмреАрдЬрдЧрдгрд┐рдд рдкреНрд░рдгрд╛рд▓реА рд▓рд┐рд╕реНрдк рдореЗрдВ рд▓рд┐рдЦреА рдЧрдИ рд╣реИред рд╡реИрд╕реЗ, рдПрдл # рдкрд░ рдХреЛрдбрдкреНрд░реЛрдЬреЗрдХреНрдЯ рдкрд░ рдкреНрд░рддреАрдХрд╛рддреНрдордХ рдЧрдгрдирд╛рдУрдВ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИ , рдФрд░ рдореЗрд░реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рд╡рд╣рд╛рдВ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдХрдо рдХреЛрдб рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЗрд╕ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдиреЗ рдореБрдЭреЗ рдкрд╛рд░реНрд╕рд┐рдВрдЧ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдореЗрдВ рдЕрдзрд┐рдХ рдЕрдиреБрднрд╡ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ, рдЕрдиреБрдХреВрд▓рди рдХрд░рдиреЗ, рдирд┐рдореНрди-рд╕реНрддрд░реАрдп рдХреЛрдб рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ, рдлрд╝реНрд▓реЛрдЯрд┐рдВрдЧ-рдкреЙрдЗрдВрдЯ рдирдВрдмрд░реЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдФрд░ рдмрд╕ рдЧрдгрд┐рдд рдореЗрдВ рдЕрдиреБрдорддрд┐ рджреАред

рд╕рднреА рд░реБрдЪрд┐ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдЗрд╕реЗ рдЧреАрдереВрдм: рд╕реНрд░реЛрдд рдкрд░ рдкреЛрд╕реНрдЯ рдХрд┐рдпрд╛ ред рдХрд╛рд░реНрдпрдХреНрд░рдо рд╕реНрд╡рдпрдВ рднреА рдЙрдкрд▓рдмреНрдз рд╣реИ: MathExpressions.NETред рддрддреНрдХрд╛рд▓ рдЬрд░реВрд░рдд рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдореИрдВ рдЗрд╕реЗ рд░рд┐рдлреНрд▓реЗрдХреНрдЯрд░ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВред рдкреБрд▓ рдЕрдиреБрд░реЛрдзреЛрдВ рдХрд╛ рд╕реНрд╡рд╛рдЧрдд рд╣реИред

PSред рдПрдХ рд▓рдВрдмрд╛ рд╕реВрддреНрд░ рджрд┐рд▓ рдореЗрдВ рдЫрд┐рдкрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рд╢рдмреНрджреЛрдВ, рдХрд╛рд░рдХреЛрдВ рдФрд░ рд╕рд░рд▓реАрдХрд░рдг рдХреА рд╡реНрдпрд╡рд╕реНрдерд╛ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрд╛ рдЧрдпрд╛ рд╣реИред рдЗрд╕рдХреА рдЬрдЯрд┐рд▓рддрд╛ рдХреЗ рджреМрд░рд╛рди, рд╡рд┐рдХрд╕рд┐рдд рдХрд╛рд░реНрдпрдХреНрд░рдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред

рдЕрджреНрдпрддрди: рдЪреВрдВрдХрд┐ рдХрд┐рд╕реА рдиреЗ рдЕрдиреБрдорд╛рди рдирд╣реАрдВ рд▓рдЧрд╛рдпрд╛ рдХрд┐ рджрд┐рд▓ рдореЗрдВ рдХреНрдпрд╛ рдПрдиреНрдХреНрд░рд┐рдкреНрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдкрд░рд┐рдгрд╛рдо рдкреЛрд╕реНрдЯ рдХрд░рддрд╛ рд╣реВрдВред рдпрд╣ рд╕реВрддреНрд░ Matiyasevich рдмрд╣реБрдкрдж рдХрд╛ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдорд╛рдорд▓рд╛ рд╣реИ , рдЬрд┐рд╕рдХреЗ рд╕рдХрд╛рд░рд╛рддреНрдордХ рдорд╛рдиреЛрдВ рдХрд╛ рд╕реЗрдЯ рдЧреИрд░-рдирдХрд╛рд░рд╛рддреНрдордХ рдорд╛рдиреЛрдВ рдХреЗ рд▓рд┐рдП primes рдХреЗ рд╕реЗрдЯ рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИред рд╡рд┐рдХрд┐рдкреАрдбрд┐рдпрд╛ рдореЗрдВ рднреА рдЬрд╛рдирдХрд╛рд░реА рд╣реИ ред

Source: https://habr.com/ru/post/In150043/


All Articles