Anatoly Vorobey (avva) wrote,
Anatoly Vorobey
avva

Category:

о странном баге

Если вы вдруг еще не знаете, то в Excel 2007 обнаружился смешной баг: если умножить, например, 77.1*850, то вместо правильного ответа 65535 Excel напишет 100,000 (сто тысяч). Он при этом сохраняет у себя в памяти правильный ответ, и если, например, его далее умножить на 2, то правильно покажет 131070, а не 200000. Но показывает он неправильно - причем только результаты некоторых операций, которые по идее должны быть равны 65535 или 65536, и только этим двум числам.

Более подробный анализ показал, что на самом деле суть в том, что ошибка происходит при выводе на показ одного из 12 чисел, чрезвычайно близких к 65535 или 65536, но не равных им в точности - например, 65534.99999999995. При умножении, скажем, 77.1*850 в ответе получается не в точности 65535, а одно из этих чисел, из-за неточностей, присущих операциям с плавающей точкой.

Но вот что интересно. Об этом баге отписались уже все кто мог. И сам Майкрософт, и сайты технологических новостей, и вся компьютерная блогосфера, начиная с самого популярного среди программистов блоггера Джоэля. Корпоративный блог Wolfram использовал этот случай, чтобы пропиарить Mathematica. Итд. итп.

И при этом ни у кого нет ни малейшего понятия о том, как этот баг мог случиться (ну, кроме программистов Excel в Майкрософте, а они не признаются).

Как полагается любым компетентным хакерам, мы сразу узнаем 65535 - это 2^16-1. Сразу становится ясно, что это наверняка что-то связанное с неправильной интерпретацией битового значения числа с плавающей точкой. Но вот загвоздка! когда действительно смотришь на эти битовые значения, то ничто подобное не вырисовывается. Никак не получается понять, что такого можно неправильно сделать с теми 12 числами, чтобы воспринять их как 100,000 или 100,001.

Должен признаться, что меня это смешит. Джоэль, и десятки других блоггеров вслед за ним, с умным лицом рассказывают читателям об операциях с плавающей точкой, о представлении чисел в этом формате, о неизбежных погрешностях, о сложностях... а объяснить, как такой баг мог бы возникнуть, совершенно не могут - и тогда становится неясно, какое вообще отношение к этой истории имеют эти объяснения и ликбезы. Может, дело вовсе не в плавающей точке. Единственная версия, которая у меня есть - и это даже версией назвать нельзя: этот баг демонстрирует, что Excel работает с числами как-то исключительно странно и извращенно, возможно, через несколько слоев плохопонятых и неадекватных библиотек, и где-то в иерархии никому до конца не понятных классов происходит какой-то глупый сбой, суть которого не имеет даже и смысле предполагать, потому что она скорее всего навязана этой глупой иерархией, а не какой-то "красивой и простой" причиной вроде неправильной интерпретации битов.
Subscribe
  • Post a new comment

    Error

    default userpic

    Your IP address will be recorded 

    When you submit the form an invisible reCAPTCHA check will be performed.
    You must follow the Privacy Policy and Google Terms of use.
  • 87 comments
Previous
← Ctrl ← Alt
Next
Ctrl → Alt →
Previous
← Ctrl ← Alt
Next
Ctrl → Alt →