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