Цитата
Видимо значение (*ptr)*(*ptr) сохраняется сначала в аккумуляторе
Язык С таких понятий как 'аккумулятор' не знает. А порядок вычислений выражений описан в стандарте. В частности, там говорится (с некоторыми упрощениями), что в бинарной операции ('*' например) сомножители приводятся к типу наибольшего из них. Затем производится умножение. Тип переменной, куда вы присваиваете результат, при выборе размера операндов не учитывается

Т.е. если вы перемножаетет 2 int'а, то и результат будет int'ом, несмотря на то, что прибавить вы его пытаетесь к float