Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Overview
Comment: | Enhance the logest.c utility with new operators: "dup", "inv", "log", and "nlogn". Provide help on an invalid input. |
---|---|
Downloads: | Tarball | ZIP archive |
Timelines: | family | ancestors | descendants | both | trunk |
Files: | files | file ages | folders |
SHA1: |
b4bd2a062c4baf5f622d61b7411f00de |
User & Date: | drh 2014-03-27 14:05:38.733 |
Context
2014-03-27
| ||
18:36 | Minor cleanup of the code in the query planner that computes the costs estimates for the various plans. There are no changes to the costs at this time. But the code is slightly more readable now and that might facilitate future enhancements. (check-in: 9b4d7226bc user: drh tags: trunk) | |
14:05 | Enhance the logest.c utility with new operators: "dup", "inv", "log", and "nlogn". Provide help on an invalid input. (check-in: b4bd2a062c user: drh tags: trunk) | |
2014-03-26
| ||
15:14 | Add an extra test case for the potential buffer overread patched by [28ddecff04]. (check-in: f585f5d7a0 user: dan tags: trunk) | |
Changes
Changes to tool/logest.c.
︙ | ︙ | |||
13 14 15 16 17 18 19 | ** integers and LogEst values and back again and for doing simple ** arithmetic operations (multiple and add) on LogEst values. ** ** Usage: ** ** ./LogEst ARGS ** | | < < < < < < | 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | ** integers and LogEst values and back again and for doing simple ** arithmetic operations (multiple and add) on LogEst values. ** ** Usage: ** ** ./LogEst ARGS ** ** See the showHelp() routine for a description of valid arguments. ** Examples: ** ** To convert 123 from LogEst to integer: ** ** ./LogEst ^123 ** ** To convert 123456 from integer to LogEst: |
︙ | ︙ | |||
92 93 94 95 96 97 98 99 | if( x<1.0 ) return -logEstFromDouble(1/x); if( x<1024.0 ) return logEstFromInteger((sqlite3_uint64)(1024.0*x)) - 100; if( x<=2000000000.0 ) return logEstFromInteger((sqlite3_uint64)x); memcpy(&a, &x, 8); e = (a>>52) - 1022; return e*10; } | | | | < | > > > > > | > > > > > > > > > > > > > > > | | > > > > > > > > > > > > > | < > | | | 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 | if( x<1.0 ) return -logEstFromDouble(1/x); if( x<1024.0 ) return logEstFromInteger((sqlite3_uint64)(1024.0*x)) - 100; if( x<=2000000000.0 ) return logEstFromInteger((sqlite3_uint64)x); memcpy(&a, &x, 8); e = (a>>52) - 1022; return e*10; } int isInteger(const char *z){ while( z[0]>='0' && z[0]<='9' ) z++; return z[0]==0; } int isFloat(const char *z){ char c; while( ((c=z[0])>='0' && c<='9') || c=='.' || c=='E' || c=='e' || c=='+' || c=='-' ) z++; return z[0]==0; } static void showHelp(const char *zArgv0){ printf("Usage: %s ARGS...\n", zArgv0); printf("Arguments:\n" " NUM Convert NUM from integer to LogEst and push onto the stack\n" " ^NUM Interpret NUM as a LogEst and push onto stack\n" " x Multiple the top two elements of the stack\n" " + Add the top two elements of the stack\n" " dup Dupliate the top element on the stack\n" " inv Take the reciprocal of the top of stack. N = 1/N.\n" " log Find the LogEst of the number on top of stack\n" " nlogn Compute NlogN where N is the top of stack\n" ); exit(1); } int main(int argc, char **argv){ int i; int n = 0; LogEst a[100]; for(i=1; i<argc; i++){ const char *z = argv[i]; if( strcmp(z,"+")==0 ){ if( n>=2 ){ a[n-2] = logEstAdd(a[n-2],a[n-1]); n--; } }else if( strcmp(z,"x")==0 ){ if( n>=2 ){ a[n-2] = logEstMultiply(a[n-2],a[n-1]); n--; } }else if( strcmp(z,"dup")==0 ){ if( n>0 ){ a[n] = a[n-1]; n++; } }else if( strcmp(z,"log")==0 ){ if( n>0 ) a[n-1] = logEstFromInteger(a[n-1]) - 33; }else if( strcmp(z,"nlogn")==0 ){ if( n>0 ) a[n-1] += logEstFromInteger(a[n-1]) - 33; }else if( strcmp(z,"inv")==0 ){ if( n>0 ) a[n-1] = -a[n-1]; }else if( z[0]=='^' ){ a[n++] = atoi(z+1); }else if( isInteger(z) ){ a[n++] = logEstFromInteger(atoi(z)); }else if( isFloat(z) && z[0]!='-' ){ a[n++] = logEstFromDouble(atof(z)); }else{ showHelp(argv[0]); } } for(i=n-1; i>=0; i--){ if( a[i]<0 ){ printf("%5d (%f)\n", a[i], 1.0/(double)logEstToInt(-a[i])); }else{ sqlite3_uint64 x = logEstToInt(a[i]+100)*100/1024; printf("%5d (%lld.%02lld)\n", a[i], x/100, x%100); } } return 0; } |