Your formatting can do with a bit more whitespace. This is just one example - I'm too lazy to copy and paste all instances where I think it should be formatted similar to this:
Code:
while (isdigit(*t) || *t == 'e' || *t == '+' || *t == '-' || *t == '.') { t++; offset++; }
should be:
Code:
while (isdigit(*t) || *t == 'e' || *t == '+' || *t == '-' || *t == '.') 
{ 
     t++; 
     offset++; 
}
Also, I'd suggest you write a stack pop/push function:
Code:
      --top; *top = atof(e);
...
      b = *top; top++;
      a = *top; top++;
      --top; *top = postfix_apply(*e, a, b);
...
It would then also be simple to add some range checking to see if the expression fits on the stack.

--
Mats