Since it appears there are no clever ways to hijack some implicit Minecraft mechanic for logarithms, I made an implementation "from scratch".
Below is the working solution. Since recursion requires multiple files, there are three functions to the solution: math/log10.mcfunction, math/impl/hsd.mcfunction, and math/impl/dshift.mcfunction.
math/log10.mcfunction:
# log10
# takes the score of a particular source and applies the base 10 logarithm,
# then stores the result in the provided result in the given target score.
#
# command format:
# /function math:log10 {targets:<selector>, targetObjective:<objective>, source:<selector>, sourceObjective:<objective>}
#
# targets: the selector in which to store the result. Can be multiple targets.
# score is a fixed point decimal - first three digits are decimals e.g the score 3140 represents 3.14
# targetObjective: the objective in which to write the result. Must be a single valid objective.
# source: the selector from which to pull the score on which the logarithm will be applied. Must be a single target.
# the score will be treated as a fixed point decimal like the targets e.g the source 3140 represents 3.14
# sourceObjective: the objective from which to read the source score. Must be a single valid objective.
# 0. copy source score into a variable that can be modified - this will be the result.
$scoreboard players operation #log10_result $(targetObjective) = $(source) $(sourceObjective)
# log of negative numbers yields complex or NaNs, so reset the score instead.
$execute if score #log10_result $(targetObjective) matches ..-1 run scoreboard players reset $(targets) $(targetObjective)
$execute if score #log10_result $(targetObjective) matches ..-1 run return fail
# 1. find highest set digit (hsd), then subtract 4 due to fixed point.
$scoreboard players set #log10_hsd $(targetObjective) -4
$function math:impl/hsd {target:"#log10_hsd",targetObjective:"$(targetObjective)",source:"#log10_result",sourceObjective:"$(targetObjective)"}
# the impl of hsd sets #log10_result = 0, so set it back.
$scoreboard players operation #log10_result $(targetObjective) = $(source) $(sourceObjective)
# 2. digit shift the original number by the hsd above (minus 3). This guarantees the number is now in the range [1.,10.]
# copy hsd into another variable since hsd is needed later on
$scoreboard players operation #log10_hsd_mutable $(targetObjective) = #log10_hsd $(targetObjective)
$function math:impl/dshift {target:"#log10_result",targetObjective:"$(targetObjective)",source:"#log10_hsd_mutable",sourceObjective:"$(targetObjective)"}
# divide the number by 3 to place the range at [1/3,10/3], an acceptable range for the Pade approximation
$scoreboard players set #log10_3 $(targetObjective) 3
$scoreboard players operation #log10_result $(targetObjective) /= #log10_3 $(targetObjective)
# 4. get the Pade approximation numerator and denominator with minimal divisions save for the cubic terms since they can overrun the integer limit
$scoreboard players set #log10_1000 $(targetObjective) 1000
# calculate polynomial powers. For the third power, divide by 1000 since it overrides the integer limit, and it's already accurate enough.
$scoreboard players operation #log10_poly_1 $(targetObjective) = #log10_result $(targetObjective)
$scoreboard players operation #log10_poly_1 $(targetObjective) -= #log10_1000 $(targetObjective)
$scoreboard players operation #log10_poly_2 $(targetObjective) = #log10_poly_1 $(targetObjective)
$scoreboard players operation #log10_poly_2 $(targetObjective) *= #log10_poly_1 $(targetObjective)
$scoreboard players operation #log10_poly_3 $(targetObjective) = #log10_poly_2 $(targetObjective)
$scoreboard players operation #log10_poly_3 $(targetObjective) /= #log10_1000 $(targetObjective)
$scoreboard players operation #log10_poly_3 $(targetObjective) *= #log10_poly_1 $(targetObjective)
# use #log10_result as temporary storage for terms and accumulate #log10_num and #log10_den
$scoreboard players set #log10_result $(targetObjective) 11
$scoreboard players operation #log10_result $(targetObjective) *= #log10_poly_3 $(targetObjective)
$scoreboard players operation #log10_num $(targetObjective) = #log10_result $(targetObjective)
$scoreboard players set #log10_result $(targetObjective) 60
$scoreboard players operation #log10_result $(targetObjective) *= #log10_poly_2 $(targetObjective)
$scoreboard players operation #log10_num $(targetObjective) += #log10_result $(targetObjective)
$scoreboard players set #log10_result $(targetObjective) 60000
$scoreboard players operation #log10_result $(targetObjective) *= #log10_poly_1 $(targetObjective)
$scoreboard players operation #log10_num $(targetObjective) += #log10_result $(targetObjective)
$scoreboard players set #log10_result $(targetObjective) 3
$scoreboard players operation #log10_result $(targetObjective) *= #log10_poly_3 $(targetObjective)
$scoreboard players operation #log10_den $(targetObjective) = #log10_result $(targetObjective)
$scoreboard players set #log10_result $(targetObjective) 36
$scoreboard players operation #log10_result $(targetObjective) *= #log10_poly_2 $(targetObjective)
$scoreboard players operation #log10_den $(targetObjective) += #log10_result $(targetObjective)
$scoreboard players set #log10_result $(targetObjective) 90000
$scoreboard players operation #log10_result $(targetObjective) *= #log10_poly_1 $(targetObjective)
$scoreboard players operation #log10_den $(targetObjective) += #log10_result $(targetObjective)
$scoreboard players add #log10_den $(targetObjective) 60000000
# 5. final linear operations to get log10:
# - divide numerator and denominator (remember to scale by 1000)
# - divide by ln10 since the Pade approximation is for ln
# - add log10(3) + hsd to account for the division and shifting
$scoreboard players set #log10_1000_ln10 $(targetObjective) 434
# weirdly, to ensure no overflow, I am doing this flipped, and I am using the ln10 to add back the 1000 decimal
$scoreboard players operation #log10_den $(targetObjective) /= #log10_1000_ln10 $(targetObjective)
$scoreboard players operation #log10_result $(targetObjective) = #log10_num $(targetObjective)
$scoreboard players operation #log10_result $(targetObjective) /= #log10_den $(targetObjective)
$scoreboard players add #log10_result $(targetObjective) 477
$scoreboard players operation #log10_hsd $(targetObjective) *= #log10_1000 $(targetObjective)
$scoreboard players operation #log10_result $(targetObjective) += #log10_hsd $(targetObjective)
# 6. finally, copy the result to the targets
$scoreboard players operation $(targets) $(targetObjective) = #log10_result $(targetObjective)
# 7. cleanup
$scoreboard players reset #log10_result $(targetObjective)
$scoreboard players reset #log10_hsd $(targetObjective)
$scoreboard players reset #log10_hsd_mutable $(targetObjective)
$scoreboard players reset #log10_3 $(targetObjective)
$scoreboard players reset #log10_1000 $(targetObjective)
$scoreboard players reset #log10_poly_1 $(targetObjective)
$scoreboard players reset #log10_poly_2 $(targetObjective)
$scoreboard players reset #log10_poly_3 $(targetObjective)
$scoreboard players reset #log10_num $(targetObjective)
$scoreboard players reset #log10_den $(targetObjective)
$scoreboard players reset #log10_1000_ln10 $(targetObjective)
math/impl/hsd.mcfunction:
$scoreboard players set #hsd_10 $(sourceObjective) 10
# body
$execute if score $(source) $(sourceObjective) matches 1.. run scoreboard players add $(target) $(targetObjective) 1
$execute if score $(source) $(sourceObjective) matches 1.. run scoreboard players operation $(source) $(sourceObjective) /= #hsd_10 $(sourceObjective)
# recursive call
$execute if score $(source) $(sourceObjective) matches 1.. run function math:impl/hsd {target:"$(target)",targetObjective:"$(targetObjective)",source:"$(source)",sourceObjective:"$(sourceObjective)"}
# cleanup
$scoreboard players reset #hsd_10 $(sourceObjective)
math/impl/dshift.mcfunction:
$scoreboard players set #dshift_10 $(targetObjective) 10
# body
$execute if score $(source) $(sourceObjective) matches 1.. run scoreboard players operation $(target) $(targetObjective) /= #dshift_10 $(targetObjective)
$execute if score $(source) $(sourceObjective) matches 1.. run scoreboard players remove $(source) $(sourceObjective) 1
$execute if score $(source) $(sourceObjective) matches ..-1 run scoreboard players operation $(target) $(targetObjective) *= #dshift_10 $(targetObjective)
$execute if score $(source) $(sourceObjective) matches ..-1 run scoreboard players add $(source) $(sourceObjective) 1
# recursive call
$execute unless score $(source) $(sourceObjective) matches 0 run function math:impl/dshift {target:"$(target)",targetObjective:"$(targetObjective)",source:"$(source)",sourceObjective:"$(sourceObjective)"}
# cleanup
$scoreboard players reset #dshift_10 $(targetObjective)
I formatted the functions as macros in order to make things similar to how scoreboard operations behave. The range I ended up choosing is [1/3,10/3] to avoid as much precision loss as I could while keeping the Pade approximation effective (see question).
The result function is surprisingly accurate; for instance, it estimates log105.000 = 0.698 which is off by less than the digits it has than the actual number, 0.69897. Without any modifications, it also gives the exact result for powers of 10, so feeding it 1.000 yields 0.000.
I imagine the general ideas given here could be extended to give more decimal digits of accuracy by adding terms to the Pade approximant up to the point the integer limit can no longer be circumvented. I haven't tested the accuracy of my current solution rigorously, but I am happy with what I have.
Finally, to answer my starting question using this function, I simply need to run the function using the command:
/function math:log10 {targets:"output",targetObjective:my_objective,source:"input",sourceObjective:my_objective}