104 columns / 51 lines = 2.04
Your calculation is skewed because the aspect ratio of each cell is vertical.
For example on Terminal.app, with 23pt font and default character spacing, each terminal cell have a width of 7px and a height of 15px for a total of 728x765px:
You cannot retrieve the font size from within Vim without invoking external commands or a way of communicating with the terminal, which can become pretty heavy. Obviously, this is different in Gvim thanks to
If you manage to do it, still you need a way to deduct the size of a cell which may vary depending on the terminal program if there is no standard. I only checked iTerm 2 which luckily have the same result.
Therefore I would opt for a static solution.
I grafted the minimum width check to this snippet you could place in
let l:topic = a:0 ? a:1 : ''
if winwidth('%') >= 160 " Minimum width
execute 'vertical botright help' l:topic
execute 'vertical resize 78'
execute 'botright help' l:topic
" Use :H to open a vertical or horizontal help split
command! -complete=help -nargs=? H call Help(<f-args>)
If the window is large enough to keep 80 columns of the current buffer, a narrow help split is opened on the right, otherwise the split is opened below. You can customize the split direction with