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