Skip to content

Commit

Permalink
Merge pull request #833 from Mr-Rm/fix-831
Browse files Browse the repository at this point in the history
fix #831: возведение в целую степень + тест
  • Loading branch information
EvilBeaver committed Nov 13, 2018
2 parents ba4006b + 0a04786 commit 3e505e2
Show file tree
Hide file tree
Showing 2 changed files with 62 additions and 4 deletions.
30 changes: 26 additions & 4 deletions src/ScriptEngine/Machine/MachineInstance.cs
Expand Up @@ -2197,13 +2197,35 @@ private void Exp(int arg)

private void Pow(int arg)
{
var powPower = (double)_operationStack.Pop().AsNumber();
var powBase = (double)_operationStack.Pop().AsNumber();
double power = Math.Pow(powBase, powPower);
_operationStack.Push(ValueFactory.Create((decimal)power));
var powPower = _operationStack.Pop().AsNumber();
var powBase = _operationStack.Pop().AsNumber();

int exp = (int)powPower;
decimal result;
if (exp >= 0 && exp == powPower)
result = PowInt(powBase, (uint)exp);
else
result = (decimal)Math.Pow((double)powBase, (double)powPower);

_operationStack.Push(ValueFactory.Create(result));
NextInstruction();
}

private decimal PowInt(decimal bas, uint exp)
{
decimal pow = 1;

while (true)
{
if ((exp & 1) == 1) pow *= bas;
exp >>= 1;
if (exp == 0) break;
bas *= bas;
}

return pow;
}

private void Sqrt(int arg)
{
var num = (double)_operationStack.Pop().AsNumber();
Expand Down
36 changes: 36 additions & 0 deletions tests/math.os
@@ -0,0 +1,36 @@
Перем юТест;

Функция ПолучитьСписокТестов(ЮнитТестирование) Экспорт

юТест = ЮнитТестирование;

ВсеТесты = Новый Массив;

ВсеТесты.Добавить("ТестДолжен_ПроверитьВозведениеВСтепень");

Возврат ВсеТесты;

КонецФункции

Процедура ТестДолжен_ПроверитьВозведениеВСтепень() Экспорт

юТест.ПроверитьРавенство(Pow(2,2), 4);
юТест.ПроверитьРавенство(Pow(2,1), 2);
юТест.ПроверитьРавенство(Pow(2,0), 1);
юТест.ПроверитьРавенство(Pow(2,-1), 0.5);
юТест.ПроверитьРавенство(Pow(2,0.5), 1.4142135623731);
юТест.ПроверитьРавенство(Pow(0.00065536,-0.125), 2.5);
юТест.ПроверитьРавенство(Pow(0,2), 0);

юТест.ПроверитьРавенство(Pow(2,50), 1125899906842624);
юТест.ПроверитьРавенство(Pow(2,50.001), 1126680591722150);
юТест.ПроверитьРавенство(Pow(2.001,50), 1154394986095681.3754617408527);
юТест.ПроверитьРавенство(Pow(2,95), 39614081257132168796771975168);
юТест.ПроверитьРавенство(Pow(2,95.9999999999999), 79228162514258900000000000000);

юТест.ПроверитьРавенство(Pow(3,32), 1853020188851841);
юТест.ПроверитьРавенство(Pow(5,22), 2384185791015625);
юТест.ПроверитьРавенство(Pow(7,18), 1628413597910449);

КонецПроцедуры

0 comments on commit 3e505e2

Please sign in to comment.