- The binary operator oDerivPower is implemented in bytecode
parent
d8dbc68e84
commit
129d404eb8
|
@ -24,6 +24,10 @@
|
|||
#include <iostream>
|
||||
#include <sstream>
|
||||
#include "CodeInterpreter.hh"
|
||||
#ifdef DEBUG_EX
|
||||
# include <math>
|
||||
# include "mex_interface.hh"
|
||||
#endif
|
||||
|
||||
using namespace std;
|
||||
|
||||
|
@ -1078,6 +1082,33 @@ print_expression(it_code_type it_code, bool evaluate, int size, int block_num, b
|
|||
Stack.push(tmp_out.str());
|
||||
#ifdef DEBUG
|
||||
mexPrintf("ok\n");
|
||||
#endif
|
||||
break;
|
||||
case oPowerDeriv:
|
||||
{
|
||||
int derivOrder = nearbyint(Stackf.top());
|
||||
Stackf.pop();
|
||||
if (fabs(v1f) < NEAR_ZERO && v2f > 0 &&
|
||||
derivOrder >= v2f &&
|
||||
fabs(v2f-nearbyint(v2f)) < NEAR_ZERO)
|
||||
Stackf.push(0.0);
|
||||
else
|
||||
{
|
||||
double dxp = pow(v1f, v2f-derivOrder);
|
||||
for (int i=0; i<derivOrder; i++)
|
||||
dxp *= v2f--;
|
||||
Stackf.push(dxp);
|
||||
}
|
||||
tmp_out.str("");
|
||||
if(isnan(r))
|
||||
tmp_out << "$ PowerDeriv £";
|
||||
else
|
||||
tmp_out << "PowerDeriv";
|
||||
tmp_out << "(" << v1 << ", " << v2 << ", " << derivOrder << ")";
|
||||
Stack.push(tmp_out.str());
|
||||
}
|
||||
#ifdef DEBUG
|
||||
tmp_out << " |PowerDeriv(" << v1 << ", " << v2 << ")|";
|
||||
#endif
|
||||
break;
|
||||
case oMax:
|
||||
|
|
|
@ -874,6 +874,35 @@ Interpreter::compute_block_time(int Per_u_, bool evaluate, int block_num, int si
|
|||
tmp_out << " |" << v1 << "^" << v2 << "|";
|
||||
#endif
|
||||
break;
|
||||
case oPowerDeriv:
|
||||
{
|
||||
int derivOrder = nearbyint(Stack.top());
|
||||
Stack.pop();
|
||||
try
|
||||
{
|
||||
if (fabs(v1) < NEAR_ZERO && v2 > 0 &&
|
||||
derivOrder >= v2 &&
|
||||
fabs(v2-nearbyint(v2)) < NEAR_ZERO)
|
||||
Stack.push(0.0);
|
||||
else
|
||||
{
|
||||
double dxp = pow1(v1, v2-derivOrder);
|
||||
for (int i=0; i<derivOrder; i++)
|
||||
dxp *= v2--;
|
||||
Stack.push(dxp);
|
||||
}
|
||||
}
|
||||
catch(FloatingPointExceptionHandling &fpeh)
|
||||
{
|
||||
mexPrintf("%s %s\n",fpeh.GetErrorMsg().c_str(),error_location(evaluate, steady_state, size, block_num, it_, Per_u_).c_str());
|
||||
go_on = false;
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef DEBUG
|
||||
tmp_out << " |PowerDeriv(" << v1 << ", " << v2 << ")|";
|
||||
#endif
|
||||
break;
|
||||
case oMax:
|
||||
Stack.push(max(v1, v2));
|
||||
#ifdef DEBUG
|
||||
|
@ -2429,7 +2458,11 @@ Interpreter::compute_blocks(string file_name, string bin_basename, bool steady_s
|
|||
delete fb;
|
||||
}
|
||||
if (block >= 0)
|
||||
go_on = false;
|
||||
{
|
||||
|
||||
go_on = false;
|
||||
}
|
||||
|
||||
break;
|
||||
case FEND:
|
||||
#ifdef DEBUG
|
||||
|
|
|
@ -38,6 +38,8 @@
|
|||
|
||||
#include <stdint.h>
|
||||
|
||||
#define NEAR_ZERO (1e-12)
|
||||
|
||||
using namespace std;
|
||||
|
||||
/**
|
||||
|
|
|
@ -2525,6 +2525,11 @@ BinaryOpNode::compile(ostream &CompileCode, unsigned int &instruction_number,
|
|||
}
|
||||
return;
|
||||
}
|
||||
if (op_code == oPowerDeriv)
|
||||
{
|
||||
FLDC_ fldc(powerDerivOrder);
|
||||
fldc.write(CompileCode, instruction_number);
|
||||
}
|
||||
arg1->compile(CompileCode, instruction_number, lhs_rhs, temporary_terms, map_idx, dynamic, steady_dynamic, tef_terms);
|
||||
arg2->compile(CompileCode, instruction_number, lhs_rhs, temporary_terms, map_idx, dynamic, steady_dynamic, tef_terms);
|
||||
FBINARY_ fbinary(op_code);
|
||||
|
|
|
@ -107,7 +107,6 @@ enum ExprNodeOutputType
|
|||
#define MIN_COST_C (40*4)
|
||||
#define MIN_COST(is_matlab) ((is_matlab) ? MIN_COST_MATLAB : MIN_COST_C)
|
||||
|
||||
#define NEAR_ZERO (1e-12)
|
||||
|
||||
//! Base class for expression nodes
|
||||
class ExprNode
|
||||
|
|
Loading…
Reference in New Issue