doubling in secp256k1 is equal to x/4 * (1 - 63/(x^3+7)) = x/4 * (x^3 - 56) / (x^3 + 7)
You can't use this in practical programs though because it makes a floating-point result. You'd need to multiply it by the group order, and to turn it into an integer you have to round or truncate it which will cause some bits at the end to be lost.
Example of wrong points calculated:
m = int("0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141", 16)
for i in [1, 2, 3]:
x = int(3/4 * (i**3-56)/(i**3+7) * m)
x = x % m
print(hex(x))
# 0xd7fffffffffffffffffffffffffffff860192d681bb3c1667eee374ce1458786
# 0x9999999999999ffffffffffffffffffc300c96b40dd9e0b33f771ba670a2c3c3
# 0x5c3c3c3c3c3c3ffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141
Notice how they are all different from vjudeu's points.
There is no floating point involved, please don't introduce one. There are no floating points in secp256k1 as well, where did you get it from? It is well known how to do division mod p, if you suddenly forgot please refresh your memory. This is used in practice, and gives the correct result for all x, since this is what the group law is after simplifications.
Cripes, I did the arithmetic literally instead of as point ops. In that case I stand corrected.