You can save a lot of program space with a linear interpolation lookup, as long as the function is fairly linear.
There is an example here:-
It has a 17 element lookup table. The top nibble of x is used to look up a value from the table, and then the next value is collected as well. The difference between them is the slope, which is multiplied by the bottom nibble, and added to the first value looked up. If the slope is negative, the product is subtracted instead of added.
In the example on that web page, if looking up the cos of 0x8C (where 0x100 is scaled as 90°), then 0x8 is used to lookup a value (decimal 180) and then the next value is taken (decimal 162). The difference is 162 - 180 = -18
That is multiplied by 0x0C and divided by 16 to give -13, and that is added to the first lookup value of 180 to give 167.
The answer represents 167/256 = 0.652
( as a comparison, with a calculator, 0x8C represents 49.2°, and the cos of that is 0.653)
I have used a similar technique on arctangents. To keep the numbers small, above arctan(1), the program works out 90 - arctan(1/x) instead of arctan(x). That uses a 5 element look up table, and an interpolation function, and is within 1° for all values.