The problem is that you are creating a depleted plaintext when you do
Plaintext ptxt = cryptoContext->MakeCKKSPackedPlaintext(x, 1, depth - 1);
but then you perform a multiplication, leaving only the last limb. Then on this last limb you do further operations. However you set firstMod to be only one bit larger than dcrtBits, which leaves very little room for the magnitude of the message, see EvalAdd does not add in some cases - #7 by ypolyakov. You can try adding 0.1 instead of 4.0 and see a correct result.
You can also change dcrtBits to 55 bits and you will get a correct value even when adding 4.
Finally, if you are not immediately performing bootstrapping, then you should do at least
Plaintext ptxt = cryptoContext->MakeCKKSPackedPlaintext(x, 1, depth - 2)
if you do not want to worry about the magnitude of the message.