Очевидно, стандарт позволяет автоматически увеличивать числа с плавающей запятой в таких выражениях. Смотрите здесь
Найдите на этой странице слово "автоматически повышен" и отметьте первый абзац с этой фразой.
Если мы пойдем по этому абзацу, насколько я понимаю, ваш sqr = x * x первоначально обрабатывается так же, как если бы он был также удвоенным, но после сохранения он округляется до числа с плавающей точкой. Затем, в вашем diff1 = sqr-x * x, x * x снова обрабатывается как double, как и sqr, хотя он уже округлен. Следовательно, он дает тот же результат, что и приведение их всех к двойным значениям: тогда sqr является двойным, но уже округлен до точности с плавающей запятой, и снова x * x с двойной точностью.