If it helps… for me, I use tables. They’re generally faster at the expense of using some ram, (though you can save a bit if you only do a 1 octave table and multiply, but I generally don’t bother), plus in my opinion they make working with other things like LFOs, pitch bends and portamentos much simpler.
Resolution-wise, the idea is to have 256 steps per semitone - this is more than 100 “cents” resolution per semitone so it’s practically imperceptible per step.
The table is a list of all of the note frequencies your synth / sample player can do (you can divide the result for an LFO too). And, depending on how your software is set up, you can have the table as a list of reciprocals to save some math (e.g. 1/f). The table generator can be as simple as starting with your base(lowest note) frequency, and for each item in the table multiply by 2^1/12*256. (I’m not sure if it does, but as that ends up being a reasonably precise number - to prevent any potential error accumulation you can “reset” what you’re multiplying by for each semitone or octave etc)
Now that you have this table, things in my opinion get much simpler. Got a midi note on? Take the note number, shift it left 8 times (e.g.multiply by 256), index the table with this value and you’ve got your frequency/reciprocal.
CV to frequency becomes trivial too, just multiply the CV value by the table octave size (12*256 = 3072 in this case). Shift the octave or tuning by simply adding to the virtual CV value.
Linear portamento like a minimoog is also easy - just walk up and down the table, same for doing frequency LFO / pitchbend stuff, it all is just a matter of traversing the table.
Just a thought, I generally use a table wherever I can to save CPU cycles when possible, even log / exp tables etc.
Now, as far as a sample player goes, you’re not playing the samples at 440 Hz, you’re playing them at the sample rate. So, if you know that your sample is tuned to play a 440hz note at 16khz… and you get a note 1 octave above to play… then you take the value you get from your table at 880hz, and multiply by (16000/440) for the frequency, etc - and now you have the 32khz playback rate frequency.
Or, I mean if you wanted to, you could generate the table with the actual sample playback rates too.