Several times I've been wondering why multiple [osc~] or [cos~] are drifting apart.
Now, just found it's a bug, that is known since 2015 (!) but didn't see it come up here on the forum yet:
Pd's cosine table has some small DC-offset.
Here is the pull request:
https://github.com/pure-data/pure-data/pull/106
And there the two relevant patches of this topic from the Pd-mailing-list:
demonstration of drift in FM:
test.pd
https://lists.puredata.info/pipermail/pd-list/2015-11/112204.html
workaround with symmetric and bigger cosine array and [tabosc4~]:
fm-fix.pd
https://lists.puredata.info/pipermail/pd-list/2015-11/112244.html
EDIT
And in here is another patch comparing different tables:
https://github.com/pure-data/pure-data/issues/105
This patch should be proper, as the array uses +3 samples for interpolation.
late EDIT:
since Pd 0.55 and ongoing, Pd's cosine table has changed to higher resolution and might get further changes for symmetry. See release notes and https://lists.puredata.info/pipermail/pd-dev/2024-06/023715.html