Here is what allegro common lisp on a pentium says:
(list (setq x (+ 1.0d0 (expt 2 -52)))
(setq y (- x 1))
(setq z (+ 1 (* y .500001d0)))
(- z 1.0d0)) ==>
(1.0000000000000002d0 2.220446049250313d-16 1.0000000000000002d0
2.220446049250313d-16)
(list (setq x (+ 1.0d0 (expt 2 -52)))
(setq y (- x 1))
(setq z (+ 1 (* y .50000d0))) ;; note change here
(- z 1.0d0)) ==>
(1.0000000000000002d0 2.220446049250313d-16 1.0d0 0.0d0)
Note that the use of 1.0d0 etc if you want double precision
in every CL.
I don't know what C is doing.
RJF