о странном баге
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)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:no subject
Я работал в Майкрософт Оффисе в 1994-1998 гг.; в Экселе тогда был и финн, и француз вьетнамского происхождения, и русская. Как будто тогда в продукте не было багов.
(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:no subject
Date: 2007-10-06 12:38 am (UTC)(no subject)
From:(no subject)
From:no subject
Date: 2007-10-05 10:18 pm (UTC)Вот ыменно. У меня было предположение, что какой-то умник решил воспользоваться командами двоично-десятичной арифметики, до сих пор живущими в x86 ISA.
no subject
Date: 2007-10-05 10:21 pm (UTC)(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From: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
(no subject)
From:no subject
Date: 2007-10-05 10:36 pm (UTC)no subject
Date: 2007-10-06 12:51 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-06 08:17 am (UTC)no subject
Date: 2007-10-05 11:09 pm (UTC)... Удивительное - рядом, но оно запрещено ...
no subject
Date: 2007-10-05 11:13 pm (UTC)Да интерн какой-нибудь напортачил.
no subject
Date: 2007-10-05 11:54 pm (UTC)no subject
Date: 2007-10-06 12:01 am (UTC)(no subject)
From:(no subject)
From:no subject
Date: 2007-10-06 12:14 am (UTC)Не совсем так. Если прибавить елиницу - то получится 100001.
no subject
Date: 2007-10-06 12:15 am (UTC)(no subject)
From:no subject
Date: 2007-10-06 12:41 am (UTC)http://ola-bini.blogspot.com/2007/09/oracle-is-stupid.html
http://ola-bini.blogspot.com/2007/09/sqlserver-is-also-stupid.html
т.е., видимо идиотия на уровня tokenizer'ов. чтож там в других местах -- страшно подумать.
no subject
Date: 2007-10-06 12:54 am (UTC)SELECT N'Я хочу оторвать письку автору лексического анализатора Microsoft SQL Server' WHERE 1 > = 0
Мне оставил анонимный комментарий мой папа: "Держись крепче за свой - автор лексического анализатора Microsoft SQL Server'
После чего появился другой анонимный комментарий: "Автора лексического анализатора Microsoft SQL Server зовут Howard Torf, и он не знает русский язык, так что надо полагать, что предыдущий комментарий является шуткой". Я вычислил автора этого комментария; он много лет проработал в Microsoft SQL Server, и в частности, переписал его синтаксический анализатор.
(no subject)
From:no subject
Date: 2007-10-06 01:07 am (UTC)в бытность мою 1с программером (1997-98) порядка 50 моих клиентов считали бухгалтерию в Excele, вполне доверяя этому продукту, чего нельзя сказать об 1с который отчетность по разным периодам округлял то в одну, а то в другую сторону, чем доводил до бешенства клиентов, а те, в свою очередь меня.
другое дело, что микрософт уже стал не тот, и когда в единственной в мире программе для табличных вычислений вылезают такие баги, это уже очень плохо...
no subject
Date: 2007-10-06 01:09 am (UTC)(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:no subject
Date: 2007-10-06 01:52 am (UTC)Хотя следует отметить, что ехцел 2000 все считает правильно.
Так что апгрейдить до 2007 подождем (у меня кстати виндовс98).
:-)
no subject
Date: 2007-10-06 02:36 am (UTC)Поздравляю Вас , господа Микрософтовцы! Миллиарды долларов и годы работы тысяч гениев микрософта пошли под хвост!
Насколько же надо быть гениальными, чтобы добиться этого выдающегося результата !
http://www.brasileiro.ru
no subject
Date: 2007-10-06 03:15 am (UTC)А про плавающие числа рассказывают, потому что 80% комментов на посты об ошибке - о том, что да-да, мы тоже ошибку нашли, вот если ещё типа 1.1 умножить на то-то, а потом перевести в целое, то получается неточно. Приходится отделять мух от котлет. Правда, не думаю, что поможет.
no subject
Date: 2007-10-06 07:42 am (UTC)Как там Шумил тот старый анекдот обыграл?
— Люди забывают, что их со всех сторон окружают киберы. Дворники, садовники, такси наконец. Обычно они молчат о том, что видят, но мне рассказывают все.
— Как так? Почему мне не рассказывают? Я же член синода! — возмущается Анна. — Ты тайное слово знаешь?
— Долгая история. Все дело в том, что местные программисты пошли по неверному пути. Этот путь называется объектно ориентированный подход в программировании. На самом деле это мина с часовым механизмом в красивой упаковке. В очень красивой упаковке. Как с этим бороться, я не знаю. Упустил момент.
— Мастер, ближе к делу.
— Знаешь анекдот, как программист кипятит чайник. Дано: пустой чайник, кран, спички, газовая плита. Программа действий: наполнить чайник водой из-под крана, поставить на плиту, зажечь газ. Ждать, пока закипит чайник. Эта программа оформляется как объект. Второй случай. Все то же самое, но чайник с водой уже стоит на плите. Действия программиста: вылить воду из чайника и выполнить предыдущий объект.
— Грустно. А нырнуть внутрь объекта нельзя? Туда, где надо газ зажечь?
— Нельзя. Можно добавить новое свойство или действие. В нашем случае — воду вылить. Будет новый объект. Но внутрь влезть нельзя. Объект дается как единое целое. Никто не знает, что там внутри. Все давно забыли, откуда ноги растут. В результате получается колоссальное дублирование кода и данных и огромная потеря производительности компьютера. С каждым годом компьютеры требуют все больше памяти, а работают все медленнее.
— Ну а как это связано с тем, что все киберы слушаются тебя?
— Когда-то, на заре исторического материализма я назначил себя главным администратором всех компьютерных систем. Эта информация попала в объект под названием «Ядро базовой операционной системы». Недавно я проверил, даже самые новые компьютеры помнят и любят меня. Об этом, кроме нас троих, никто больше не знает.
no subject
Date: 2007-10-06 08:25 am (UTC)(no subject)
From:(no subject)
From:(no subject)
From:Re: Reply to your comment...
From:Re: Reply to your comment...
From:no subject
Date: 2007-10-06 08:04 am (UTC)Самое забавное, что Вы можете быть правы. Во глубине истории все электронные таблицы имели специальные инхауз разработаные ухищрения для быстрых математических вычислений на компьютерах без сопроцессоров( до 486х это было весьма актуально)так что вполне возможно что,баг растет корнями из какого то забытого с тех пор кусочка кода.
no subject
Date: 2007-10-06 02:45 pm (UTC)no subject
Date: 2007-10-07 01:15 pm (UTC)no subject
Date: 2007-10-08 09:21 am (UTC)no subject
Date: 2007-10-10 01:55 pm (UTC)чем-то похоже на старый/печально известный FIST bug.
возможно, Float-to-Integer conversion как-то замешан и здесь?