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