о странном баге
Oct. 5th, 2007 11:54 pmЕсли вы вдруг еще не знаете, то в 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 работает с числами как-то исключительно странно и извращенно, возможно, через несколько слоев плохопонятых и неадекватных библиотек, и где-то в иерархии никому до конца не понятных классов происходит какой-то глупый сбой, суть которого не имеет даже и смысле предполагать, потому что она скорее всего навязана этой глупой иерархией, а не какой-то "красивой и простой" причиной вроде неправильной интерпретации битов.
Более подробный анализ показал, что на самом деле суть в том, что ошибка происходит при выводе на показ одного из 12 чисел, чрезвычайно близких к 65535 или 65536, но не равных им в точности - например, 65534.99999999995. При умножении, скажем, 77.1*850 в ответе получается не в точности 65535, а одно из этих чисел, из-за неточностей, присущих операциям с плавающей точкой.
Но вот что интересно. Об этом баге отписались уже все кто мог. И сам Майкрософт, и сайты технологических новостей, и вся компьютерная блогосфера, начиная с самого популярного среди программистов блоггера Джоэля. Корпоративный блог Wolfram использовал этот случай, чтобы пропиарить Mathematica. Итд. итп.
И при этом ни у кого нет ни малейшего понятия о том, как этот баг мог случиться (ну, кроме программистов Excel в Майкрософте, а они не признаются).
Как полагается любым компетентным хакерам, мы сразу узнаем 65535 - это 2^16-1. Сразу становится ясно, что это наверняка что-то связанное с неправильной интерпретацией битового значения числа с плавающей точкой. Но вот загвоздка! когда действительно смотришь на эти битовые значения, то ничто подобное не вырисовывается. Никак не получается понять, что такого можно неправильно сделать с теми 12 числами, чтобы воспринять их как 100,000 или 100,001.
Должен признаться, что меня это смешит. Джоэль, и десятки других блоггеров вслед за ним, с умным лицом рассказывают читателям об операциях с плавающей точкой, о представлении чисел в этом формате, о неизбежных погрешностях, о сложностях... а объяснить, как такой баг мог бы возникнуть, совершенно не могут - и тогда становится неясно, какое вообще отношение к этой истории имеют эти объяснения и ликбезы. Может, дело вовсе не в плавающей точке. Единственная версия, которая у меня есть - и это даже версией назвать нельзя: этот баг демонстрирует, что Excel работает с числами как-то исключительно странно и извращенно, возможно, через несколько слоев плохопонятых и неадекватных библиотек, и где-то в иерархии никому до конца не понятных классов происходит какой-то глупый сбой, суть которого не имеет даже и смысле предполагать, потому что она скорее всего навязана этой глупой иерархией, а не какой-то "красивой и простой" причиной вроде неправильной интерпретации битов.
no subject
Date: 2007-10-05 10:06 pm (UTC)При этом автор ещё и забыл 0x поставить.
"Excel работает с числами как-то исключительно странно и извращенно, возможно, через несколько слоев плохопонятых и неадекватных библиотек" - это и так было очевидно.
(Понабрали индусов по объявлениям, теперь получают то, чего заслуживают.)
no subject
Date: 2007-10-05 10:16 pm (UTC)no subject
Date: 2007-10-05 10:18 pm (UTC)Вот ыменно. У меня было предположение, что какой-то умник решил воспользоваться командами двоично-десятичной арифметики, до сих пор живущими в x86 ISA.
no subject
Date: 2007-10-05 10:21 pm (UTC)no subject
Date: 2007-10-05 10:21 pm (UTC)no subject
Date: 2007-10-05 10:23 pm (UTC)string visible;
double x;
try
{
x = calculate(formula);
visible = tostring(x);
}
catch
{
visible = "100000"; //oh, dude, fixme, when you have a minute...
}
cell.text = visible;
cell.value = x;
no subject
Date: 2007-10-05 10:23 pm (UTC)Нет, сомневаюсь все же, но какая живописная версия!
no subject
Date: 2007-10-05 10:24 pm (UTC)no subject
Date: 2007-10-05 10:26 pm (UTC)(Как-то недавно публиковали в сети групповую фотографию разработчиков IE7 - так лучшей рекламы альтернативных браузеров я бы не придумал, даже если бы очень старался.)
no subject
no subject
Date: 2007-10-05 10:29 pm (UTC)no subject
Date: 2007-10-05 10:36 pm (UTC)no subject
Date: 2007-10-05 10:36 pm (UTC)no subject
Date: 2007-10-05 10:43 pm (UTC)повторили подвиг Пентиумав таблице недоставало пары последних элементов.no subject
Date: 2007-10-05 10:52 pm (UTC)no subject
Date: 2007-10-05 10:53 pm (UTC)no subject
Date: 2007-10-05 11:09 pm (UTC)... Удивительное - рядом, но оно запрещено ...
no subject
Date: 2007-10-05 11:13 pm (UTC)Да интерн какой-нибудь напортачил.
no subject
Я работал в Майкрософт Оффисе в 1994-1998 гг.; в Экселе тогда был и финн, и француз вьетнамского происхождения, и русская. Как будто тогда в продукте не было багов.
no subject
Date: 2007-10-05 11:14 pm (UTC)no subject
Date: 2007-10-05 11:16 pm (UTC)Двух.
Или трёх.
В Майкрософт Оффисе баги были всегда, это верно. Но не настолько же тупые...
Или настолько же?
no subject
Date: 2007-10-05 11:18 pm (UTC)Причём всё это вынесено куда-то в define, которые определены где-то в совершенно другом месте и в другом файле, поэтому на глаз распознать ошибку нереально.
no subject
Date: 2007-10-05 11:18 pm (UTC)no subject
Извините, я не могу вас воспринимать всерьёз, и поэтому не стану отвечать подробнее.
no subject