2.2250738585072011e-308 баг

В каком-то смысле ситуация с недавно (январь 2011 года) обнаруженным багом в некоторых версиях php весьма типична. Оптимизирующий компилятор опять оптимизировал то, что не следовало бы оптимизировать.

Алгоритм преобразования десятичных строк в числа с плавающей точкой весьма изощрен, но, насколько мы понимаем, он рассчитан на стандартную ариметику с плавающей точкой двойной точности. Не на расширенные 80-битные числа с плавающей точкой, которыми оперирует интеловский сопроцессор. В данном случае расширенная точность (precision) оказалось причиной того, что грамотно разработанный алгоритм выдает неожиданный результат, и zend_strod сваливается в бесконечный цикл.

Заплатка была выпущена весьма оперативно. Разработчики добавили ключевое слово volatile, чтобы пофиксить данный баг. Volatile заставляет компилятор сохранять все промежуточные вычисления в памяти, восстанавливая таким образом корректную семантику вычислений с double в стиле IEEE-754.