avva: (Default)
[personal profile] avva
Если вы вдруг еще не знаете, то в 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 работает с числами как-то исключительно странно и извращенно, возможно, через несколько слоев плохопонятых и неадекватных библиотек, и где-то в иерархии никому до конца не понятных классов происходит какой-то глупый сбой, суть которого не имеет даже и смысле предполагать, потому что она скорее всего навязана этой глупой иерархией, а не какой-то "красивой и простой" причиной вроде неправильной интерпретации битов.

Date: 2007-10-05 10:06 pm (UTC)
From: [identity profile] ohtori.livejournal.com
Ну что-то типа "если число равно 100000 минус один, то записать туда 100000".
При этом автор ещё и забыл 0x поставить.
"Excel работает с числами как-то исключительно странно и извращенно, возможно, через несколько слоев плохопонятых и неадекватных библиотек" - это и так было очевидно.
(Понабрали индусов по объявлениям, теперь получают то, чего заслуживают.)

Date: 2007-10-05 10:16 pm (UTC)
From: [identity profile] itman.livejournal.com
65536 = 0x10000, а не 0x100000

(no subject)

From: [identity profile] http://users.livejournal.com/d_m_/ - Date: 2007-10-05 10:24 pm (UTC) - Expand

(no subject)

From: [identity profile] kcmamu.livejournal.com - Date: 2007-10-05 10:29 pm (UTC) - Expand

(no subject)

From: [identity profile] ohtori.livejournal.com - Date: 2007-10-05 11:18 pm (UTC) - Expand

(no subject)

From: [identity profile] itman.livejournal.com - Date: 2007-10-06 02:43 am (UTC) - Expand

(no subject)

From: [identity profile] trueblacker.livejournal.com - Date: 2007-10-06 08:12 am (UTC) - Expand

(no subject)

From: [identity profile] ohtori.livejournal.com - Date: 2007-10-05 10:26 pm (UTC) - Expand

Date: 2007-10-05 11:13 pm (UTC)
From: [identity profile] ygam.livejournal.com
Я много лет работал с индийцами; среди них есть умнейшие люди очень высокой квалификации. Мне не кажется, они как группа менее квалифицированы, чем представители любой другой нации.

Я работал в Майкрософт Оффисе в 1994-1998 гг.; в Экселе тогда был и финн, и француз вьетнамского происхождения, и русская. Как будто тогда в продукте не было багов.

(no subject)

From: [identity profile] ohtori.livejournal.com - Date: 2007-10-05 11:16 pm (UTC) - Expand

(no subject)

From: [identity profile] ygam.livejournal.com - Date: 2007-10-05 11:26 pm (UTC) - Expand

(no subject)

From: [identity profile] ohtori.livejournal.com - Date: 2007-10-05 11:27 pm (UTC) - Expand

(no subject)

From: [identity profile] taste-of.livejournal.com - Date: 2007-10-06 12:20 am (UTC) - Expand

(no subject)

From: [identity profile] vsopvs.livejournal.com - Date: 2007-10-06 12:33 am (UTC) - Expand

(no subject)

From: [identity profile] ivan-gandhi.livejournal.com - Date: 2007-10-06 04:53 am (UTC) - Expand

(no subject)

From: [identity profile] http://users.livejournal.com/d_m_/ - Date: 2007-10-06 05:35 pm (UTC) - Expand

(no subject)

From: [identity profile] ygam.livejournal.com - Date: 2007-10-06 06:08 pm (UTC) - Expand

(no subject)

From: [identity profile] http://users.livejournal.com/d_m_/ - Date: 2007-10-06 07:06 pm (UTC) - Expand

Date: 2007-10-06 12:38 am (UTC)
From: [identity profile] avva.livejournal.com
Хотел бы я быть столь же хорошим программистом, как коллега-индус, который работает над тем же проектом, что и я...

(no subject)

From: [identity profile] ohtori.livejournal.com - Date: 2007-10-06 12:42 am (UTC) - Expand

(no subject)

From: [identity profile] madfire.livejournal.com - Date: 2007-10-07 01:22 pm (UTC) - Expand

Date: 2007-10-05 10:18 pm (UTC)
spamsink: (Default)
From: [personal profile] spamsink
этот баг демонстрирует, что Excel работает с числами как-то исключительно странно и извращенно

Вот ыменно. У меня было предположение, что какой-то умник решил воспользоваться командами двоично-десятичной арифметики, до сих пор живущими в x86 ISA.

Date: 2007-10-05 10:21 pm (UTC)
From: [identity profile] pappadeux.livejournal.com
What about Excel for Itanium ?

(no subject)

From: [personal profile] spamsink - Date: 2007-10-05 10:36 pm (UTC) - Expand

(no subject)

From: [identity profile] ygam.livejournal.com - Date: 2007-10-05 11:18 pm (UTC) - Expand

(no subject)

From: [identity profile] ygam.livejournal.com - Date: 2007-10-12 01:19 am (UTC) - Expand

(no subject)

From: [identity profile] avva.livejournal.com - Date: 2007-10-05 10:23 pm (UTC) - Expand

(no subject)

From: [personal profile] spamsink - Date: 2007-10-05 10:43 pm (UTC) - Expand

(no subject)

From: [identity profile] ivan-gandhi.livejournal.com - Date: 2007-10-06 05:53 am (UTC) - Expand

(no subject)

From: [identity profile] vvstepa.livejournal.com - Date: 2007-10-06 10:17 am (UTC) - Expand

(no subject)

From: [identity profile] dimpas.livejournal.com - Date: 2007-10-06 04:46 pm (UTC) - Expand

(no subject)

From: [personal profile] spamsink - Date: 2007-10-06 05:04 pm (UTC) - Expand

(no subject)

From: [identity profile] dimpas.livejournal.com - Date: 2007-10-06 05:11 pm (UTC) - Expand

(no subject)

From: [identity profile] ygam.livejournal.com - Date: 2007-10-06 06:07 pm (UTC) - Expand

(no subject)

From: [identity profile] begemotv2718.livejournal.com - Date: 2007-10-06 05:44 am (UTC) - Expand

(no subject)

From: [identity profile] mtyukanov.livejournal.com - Date: 2007-10-06 07:23 am (UTC) - Expand

(no subject)

From: [identity profile] ygam.livejournal.com - Date: 2007-10-12 01:19 am (UTC) - Expand

(no subject)

From: [identity profile] mtyukanov.livejournal.com - Date: 2007-10-12 10:18 am (UTC) - Expand

(no subject)

From: [identity profile] ygam.livejournal.com - Date: 2007-10-05 11:14 pm (UTC) - Expand

Date: 2007-10-05 10:21 pm (UTC)
From: [identity profile] http://users.livejournal.com/d_m_/
Возможно, это 12 чисел просто захардкодили? :)

Date: 2007-10-05 10:23 pm (UTC)
From: [identity profile] nchaly.livejournal.com
Может, что-то вроде
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;

Date: 2007-10-05 10:27 pm (UTC)
From: [identity profile] ohtori.livejournal.com
Коммент рулит, да.

(no subject)

From: [identity profile] ivan-gandhi.livejournal.com - Date: 2007-10-06 05:54 am (UTC) - Expand

Date: 2007-10-05 10:36 pm (UTC)
From: [identity profile] ly0lik.livejournal.com
yet another Easter Egg?:)

Date: 2007-10-06 12:51 pm (UTC)
From: [identity profile] neatfires.livejournal.com
If it's an egg, I'd expect anything hatching out of it to look like a cockroach.

Date: 2007-10-05 10:52 pm (UTC)
From: [identity profile] msh.livejournal.com
Какой-нибудь старый кривой код форматирования с обработкой по два байта, где перепутали > и >=

Date: 2007-10-05 10:53 pm (UTC)
From: [identity profile] trurle.livejournal.com
Судя по описаниям бага, проблема в форматировании а не в вычислениях или представлении числа.

Date: 2007-10-06 08:17 am (UTC)
From: [identity profile] trueblacker.livejournal.com
скорее, судя по описанию, сказать наверняка, в чём именно заключается баг не представляется возможным

Date: 2007-10-05 11:09 pm (UTC)
From: [identity profile] slobin.livejournal.com
Когда-то давно я работал на СМ-3, на которой не было аппаратных команд умножения и деления (целочисленных, о плавающей точке речь вообще не шла). Это два действия делались какими-то стандартными библиотеками, не помню какими. И написал я как-то генератор случайных чисел, что-то вроде ((n * 25173) + 13849) mod 65536 (сразу после написания этого выражения специально нашёл и скачал Грогоно и убедился, что цифры помню верно; вот ведь ерунда в памяти застревает ;-). Довольно быстро оказалось, что в некоторый повторяющийся момент он падает с ошибкой. Тогда я перебрал в цикле все 65536 произведений вида 25173 * n (перебрать 2^32 на тогдашней технике было нереально) и обнаружил, что на двух не то трёх из них библиотечное умножение слетает с ошибкой. Отчего, почему? До сих пор не знаю. Двадцать два года прошло.

... Удивительное - рядом, но оно запрещено ...

Date: 2007-10-05 11:13 pm (UTC)
From: [identity profile] cema.livejournal.com
И при этом ни у кого нет ни малейшего понятия о том, как этот баг мог случиться (ну, кроме программистов Excel в Майкрософте, а они не признаются).

Да интерн какой-нибудь напортачил.

Date: 2007-10-05 11:54 pm (UTC)
From: [identity profile] selfmade.livejournal.com
ВСЕ рассуждают, и НИКТО debugger'ом не посмотрел. Программисты, блин. :)

Date: 2007-10-06 12:01 am (UTC)
From: [identity profile] avva.livejournal.com
Ну щас мы будем по Экселю с дебаггером ползать. Есть же пределы и мазохизму.

(no subject)

From: [identity profile] cema.livejournal.com - Date: 2007-10-06 12:21 am (UTC) - Expand

(no subject)

From: [identity profile] trueblacker.livejournal.com - Date: 2007-10-06 08:19 am (UTC) - Expand

Date: 2007-10-06 12:14 am (UTC)
From: [identity profile] dragon-ru.livejournal.com
/* Он при этом сохраняет у себя в памяти правильный ответ, и если, например, его далее умножить на 2, то правильно покажет 131070 */

Не совсем так. Если прибавить елиницу - то получится 100001.

Date: 2007-10-06 12:15 am (UTC)
From: [identity profile] avva.livejournal.com
Я знаю, я потом упоминаю 100001 в записи. Просто скучно же пересказывать все подробности, и зачем ссылки вообще в записи? :)

(no subject)

From: [identity profile] dragon-ru.livejournal.com - Date: 2007-10-06 01:11 am (UTC) - Expand

Date: 2007-10-06 12:41 am (UTC)
From: [identity profile] pingva.livejournal.com
ты вот на это полюбуйся:

http://ola-bini.blogspot.com/2007/09/oracle-is-stupid.html

http://ola-bini.blogspot.com/2007/09/sqlserver-is-also-stupid.html

т.е., видимо идиотия на уровня tokenizer'ов. чтож там в других местах -- страшно подумать.

Date: 2007-10-06 12:54 am (UTC)
From: [identity profile] ygam.livejournal.com
Я в прошлом блоге написал:

SELECT N'Я хочу оторвать письку автору лексического анализатора Microsoft SQL Server' WHERE 1 > = 0

Мне оставил анонимный комментарий мой папа: "Держись крепче за свой - автор лексического анализатора Microsoft SQL Server'

После чего появился другой анонимный комментарий: "Автора лексического анализатора Microsoft SQL Server зовут Howard Torf, и он не знает русский язык, так что надо полагать, что предыдущий комментарий является шуткой". Я вычислил автора этого комментария; он много лет проработал в Microsoft SQL Server, и в частности, переписал его синтаксический анализатор.

(no subject)

From: [identity profile] pingva.livejournal.com - Date: 2007-10-06 04:22 am (UTC) - Expand

Date: 2007-10-06 01:07 am (UTC)
From: [identity profile] b0rg.livejournal.com
честно сказать не разделяю вашего веселья.
в бытность мою 1с программером (1997-98) порядка 50 моих клиентов считали бухгалтерию в Excele, вполне доверяя этому продукту, чего нельзя сказать об 1с который отчетность по разным периодам округлял то в одну, а то в другую сторону, чем доводил до бешенства клиентов, а те, в свою очередь меня.

другое дело, что микрософт уже стал не тот, и когда в единственной в мире программе для табличных вычислений вылезают такие баги, это уже очень плохо...

Date: 2007-10-06 01:09 am (UTC)
From: [identity profile] ygam.livejournal.com
Я вспомнил историю (не знаю, правдивую или нет), которую мне рассказывали экселевцы. Один хирург использовал Эксель для рассчета доз лекарств. Однажды во время операции программа упала. Хирург подал в суд на Майкрософт...

(no subject)

From: [identity profile] b0rg.livejournal.com - Date: 2007-10-06 01:19 am (UTC) - Expand

(no subject)

From: [identity profile] ygam.livejournal.com - Date: 2007-10-06 03:18 am (UTC) - Expand

(no subject)

From: [identity profile] trueblacker.livejournal.com - Date: 2007-10-06 08:26 am (UTC) - Expand

(no subject)

From: [identity profile] b0rg.livejournal.com - Date: 2007-10-06 03:26 pm (UTC) - Expand

(no subject)

From: [identity profile] trueblacker.livejournal.com - Date: 2007-10-06 03:32 pm (UTC) - Expand

(no subject)

From: [identity profile] b0rg.livejournal.com - Date: 2007-10-06 03:50 pm (UTC) - Expand

(no subject)

From: [identity profile] zigmar.livejournal.com - Date: 2007-10-16 04:25 pm (UTC) - Expand

(no subject)

From: [identity profile] zigmar.livejournal.com - Date: 2007-10-16 04:18 pm (UTC) - Expand

(no subject)

From: [identity profile] b0rg.livejournal.com - Date: 2007-10-16 04:31 pm (UTC) - Expand

(no subject)

From: [identity profile] zigmar.livejournal.com - Date: 2007-10-16 05:06 pm (UTC) - Expand

Date: 2007-10-06 01:52 am (UTC)
From: (Anonymous)
Обычное дело. Каждый раз, когда что-то крашится или багится, билл гейтс получает один цент. Вот и заработал.

Хотя следует отметить, что ехцел 2000 все считает правильно.
Так что апгрейдить до 2007 подождем (у меня кстати виндовс98).
:-)

Date: 2007-10-06 02:36 am (UTC)
From: [identity profile] brasileiro-ru.livejournal.com
Как меня достал Виндоус Виста! Сил нет. Дома стоит мощнейший комп, а вся семья работают на ноутбуке, потому что на большом стоит португальская Виста, купленная за 400 долларов!
Поздравляю Вас , господа Микрософтовцы! Миллиарды долларов и годы работы тысяч гениев микрософта пошли под хвост!
Насколько же надо быть гениальными, чтобы добиться этого выдающегося результата !

http://www.brasileiro.ru

Date: 2007-10-06 03:15 am (UTC)
From: [identity profile] moon-aka-sun.livejournal.com
Может, какая-то излишняя оптимизация. Не хотят, типа, переводить в строку, смотреть что там и как, решили хэк какой-то применить и анализировать два байта. А он боком вылез.

А про плавающие числа рассказывают, потому что 80% комментов на посты об ошибке - о том, что да-да, мы тоже ошибку нашли, вот если ещё типа 1.1 умножить на то-то, а потом перевести в целое, то получается неточно. Приходится отделять мух от котлет. Правда, не думаю, что поможет.

Date: 2007-10-06 07:42 am (UTC)
From: [identity profile] alex-rex.livejournal.com
И пойдёт оно в века...

Как там Шумил тот старый анекдот обыграл?
   — Люди забывают, что их со всех сторон окружают киберы. Дворники, садовники, такси наконец. Обычно они молчат о том, что видят, но мне рассказывают все.
   — Как так? Почему мне не рассказывают? Я же член синода! — возмущается Анна. — Ты тайное слово знаешь?
   — Долгая история. Все дело в том, что местные программисты пошли по неверному пути. Этот путь называется объектно ориентированный подход в программировании. На самом деле это мина с часовым механизмом в красивой упаковке. В очень красивой упаковке. Как с этим бороться, я не знаю. Упустил момент.
   — Мастер, ближе к делу.
   — Знаешь анекдот, как программист кипятит чайник. Дано: пустой чайник, кран, спички, газовая плита. Программа действий: наполнить чайник водой из-под крана, поставить на плиту, зажечь газ. Ждать, пока закипит чайник. Эта программа оформляется как объект. Второй случай. Все то же самое, но чайник с водой уже стоит на плите. Действия программиста: вылить воду из чайника и выполнить предыдущий объект.
   — Грустно. А нырнуть внутрь объекта нельзя? Туда, где надо газ зажечь?
   — Нельзя. Можно добавить новое свойство или действие. В нашем случае — воду вылить. Будет новый объект. Но внутрь влезть нельзя. Объект дается как единое целое. Никто не знает, что там внутри. Все давно забыли, откуда ноги растут. В результате получается колоссальное дублирование кода и данных и огромная потеря производительности компьютера. С каждым годом компьютеры требуют все больше памяти, а работают все медленнее.
   — Ну а как это связано с тем, что все киберы слушаются тебя?
   — Когда-то, на заре исторического материализма я назначил себя главным администратором всех компьютерных систем. Эта информация попала в объект под названием «Ядро базовой операционной системы». Недавно я проверил, даже самые новые компьютеры помнят и любят меня. Об этом, кроме нас троих, никто больше не знает.

Date: 2007-10-06 08:25 am (UTC)
From: [identity profile] migmit.livejournal.com
Шумил в программировании, мягко говоря, не очень понимает.

(no subject)

From: [identity profile] alex-rex.livejournal.com - Date: 2007-10-06 08:30 am (UTC) - Expand

(no subject)

From: [identity profile] migmit.livejournal.com - Date: 2007-10-06 08:35 am (UTC) - Expand

(no subject)

From: [identity profile] http://users.livejournal.com/d_m_/ - Date: 2007-10-06 06:55 pm (UTC) - Expand

Re: Reply to your comment...

From: [identity profile] migmit.livejournal.com - Date: 2007-10-06 09:00 pm (UTC) - Expand

Date: 2007-10-06 08:04 am (UTC)
From: [identity profile] vasja-iz-aa.livejournal.com
и это даже версией назвать нельзя: этот баг демонстрирует, что Excel работает с числами как-то исключительно странно и извращенно, возможно, через несколько слоев ...

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

Date: 2007-10-06 02:45 pm (UTC)
From: [identity profile] prosto-tak.livejournal.com
Да, меня это тоже как-то задело. От Джоэла я такого не ожидал.

Date: 2007-10-07 01:15 pm (UTC)
From: [identity profile] madfire.livejournal.com
Так гадко стало. Пустышка.

Date: 2007-10-08 09:21 am (UTC)
From: [identity profile] aburachil.livejournal.com
А может это не баг, а фича?

Date: 2007-10-10 01:55 pm (UTC)
From: [identity profile] nevelichko.livejournal.com
занятно.
чем-то похоже на старый/печально известный FIST bug.
возможно, Float-to-Integer conversion как-то замешан и здесь?


February 2026

S M T W T F S
1 2 3 4 5 67
8 9 10111213 14
15 16 17 18192021
2223 2425262728

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Feb. 24th, 2026 10:20 am
Powered by Dreamwidth Studios