Может ли кто-нибудь подтвердить, как Microsoft Excel 2007 внутренне представляет числа?

Я знаю стандарт IEEE 754 с плавающей запятой наизусть, так как мне пришлось выучить его для экзамена. Я точно знаю, как используются числа с плавающей запятой и с какими проблемами они могут столкнуться. Я могу вручную выполнить любую операцию над двоичным представлением чисел с плавающей запятой.

Однако я не нашел ни одного источника, в котором бы однозначно говорилось, что Excel использует 64-битные числа с плавающей запятой для внутреннего представления каждого «типа» ячейки в Excel, кроме текста. Я понятия не имею, используют ли некоторые типы целые числа со знаком или без знака, а некоторые используют 64-битную плавающую точку.

Я нашел буквально триллионы статей, в которых 1) описываются числа с плавающей запятой, а затем 2) говорится об осторожности с Excel из-за чисел с плавающей запятой. Я не нашел ни одного утверждения, в котором говорилось бы, что «все типы представляют собой 64-битные числа с плавающей запятой, кроме текста». Я не нашел ни одного утверждения, в котором говорилось бы: «Изменение типа ячейки изменяет только ее визуальное представление, а не ее внутреннее представление, если вы не измените тип с текста на какой-либо другой тип, который не является текстом, или вы измените какой-либо другой тип, который является не текст в текст".

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


person Jon    schedule 12.05.2010    source источник
comment
Я думаю, что Excel, как и большинство продуктов Microsoft, хранит числа в виде последовательностей единиц и нулей, а более старые версии время от времени используют случайные двойки.   -  person mdma    schedule 12.05.2010
comment
на ваш вопрос был дан правильный ответ дважды на основе вашего исходного вопроса, который был немного расплывчатым, поэтому у вас есть два правильных ответа: один ответ в старом формате XLS (2003 г.), а другой - в более новом формате XLSX (2007 г.). Вы просто переписали свой вопрос до такой степени, что он полностью отличается от того, что вы задали, и того, что вам ответили. Вы спросили конкретно о формате файлов Excel 2007 и о том, как в нем хранятся числа с плавающей запятой. Формат по умолчанию для 2007 года - XLSX, поэтому я ответил за это, другим вариантом мог быть XLS, для которого предназначен ответ кодеки.   -  person Rodney S. Foley    schedule 14.05.2010
comment
кажется, теперь вы спрашиваете о том, как Excel 2007 представляет значения ячеек в ПАМЯТИ, тогда как раньше казалось очевидным, что вы спрашиваете, как они представлены в форматах файлов. Форматы файлов хорошо документированы, однако причина, по которой вы не нашли то, что ищете, заключается в том, что Microsoft по какой-то причине не документирует этот материал. Таким образом, хотя ответ был бы простым для одного из разработчиков основной команды Excel в Microsoft, найти его за пределами этой команды может быть непросто. Вы должны найти блог членов команды Excel и попытаться отправить ему электронное письмо или опубликовать свой вопрос.   -  person Rodney S. Foley    schedule 14.05.2010
comment
@Creepy Gnome - я вообще не редактировал свой вопрос, он остался таким же, как когда я его опубликовал. Ваш ответ был полезен, но я действительно хотел знать, как он хранит значения в памяти и преобразует ли он их в другой тип, когда над ними выполняются математические операции, поскольку некоторые алгоритмы нестабильны при использовании чисел с плавающей запятой.   -  person Jon    schedule 15.05.2010


Ответы (3)


Excel 2007 поддерживает формат OpenXML, который представляет собой файл ZIP (.XLSX), содержащий набор файлов XML. Существует SDK для работы с форматом OpenXML, документацию по которому можно получить здесь и загрузите его здесь.

В основном числа хранятся в виде обычного текста внутри элемента, поэтому, если ячейка A1 имеет номер 42, а ячейка A2 имеет номер 81,56 в пользовательском интерфейсе, XML будет выглядеть как следующий фрагмент XML:

<row r="1" spans="1:2">
    <c r="A1">
        <v>42</v>
    </c>
    <c r="B1">
        <v>81.569999999999993</v>
    </c>
</row>

При работе с OpenXML я настоятельно рекомендую просто использовать SDK, а не искать его самостоятельно.

person Rodney S. Foley    schedule 12.05.2010

На этой странице есть ссылка на внутренние типы данных Excel.

person Dean Harding    schedule 12.05.2010

Он сохранил числа как двойные.

person liya    schedule 12.05.2010