00001 #include "xtended.hh" 00002 #include "Text.hh" 00003 #include <math.h> 00004 00005 #include "floats.hh" 00006 00007 class LogPrim : public xtended 00008 { 00009 00010 public: 00011 00012 LogPrim() : xtended("log") {} 00013 00014 virtual unsigned int arity () { return 1; } 00015 00016 virtual bool needCache () { return true; } 00017 00018 virtual Type infereSigType (const vector<Type>& args) 00019 { 00020 assert (args.size() == arity()); 00021 interval i = args[0]->getInterval(); 00022 if (i.valid & i.lo>0) { 00023 return castInterval(floatCast(args[0]), interval(log(i.lo), log(i.hi))); 00024 } else { 00025 return floatCast(args[0]); 00026 } 00027 } 00028 00029 virtual void sigVisit (Tree sig, sigvisitor* visitor) {} 00030 00031 virtual int infereSigOrder (const vector<int>& args) { 00032 assert (args.size() == arity()); 00033 return args[0]; 00034 } 00035 00036 00037 virtual Tree computeSigOutput (const vector<Tree>& args) { 00038 num n; 00039 assert (args.size() == arity()); 00040 if (isNum(args[0],n)) { 00041 return tree(log(double(n))); 00042 } else { 00043 return tree(symbol(), args[0]); 00044 } 00045 } 00046 00047 virtual string generateCode (Klass* klass, const vector<string>& args, const vector<Type>& types) 00048 { 00049 assert (args.size() == arity()); 00050 assert (types.size() == arity()); 00051 00052 return subst("log$1($0)", args[0], isuffix()); 00053 } 00054 00055 virtual string generateLateq (Lateq* lateq, const vector<string>& args, const vector<Type>& types) 00056 { 00057 assert (args.size() == arity()); 00058 assert (types.size() == arity()); 00059 00060 return subst("\\ln\\left( $0 \\right)", args[0]); 00061 } 00062 00063 }; 00064 00065 00066 xtended* gLogPrim = new LogPrim(); 00067 00068