Преобразование чисел с плавающей запятой до IEEE-754 C ++ в / из C # - PullRequest
1 голос
/ 22 апреля 2010

До .Net, до математических сопроцессоров, до IEEE-574, Microsoft определила битовую комбинацию для чисел с плавающей запятой.Старые версии компилятора C ++ успешно использовали это определение.

Я пишу приложение на C #, которое должно читать / записывать такие числа с плавающей запятой в файл.Как я могу сделать преобразования между 2-битными форматами?Мне нужны методы преобразования в обоих направлениях.

Это приложение будет работать в среде PocketPC / WinCE.

Изменение структуры файла выходит за рамки этого проекта.

Есть ли опция компилятора C ++, которая инструктирует его использовать старый формат FP?Это было бы идеально.Затем я мог бы обмениваться данными между кодом C # и кодом C ++ с помощью текстовой строки с нулевым символом в конце, и методы C ++ были бы простыми обертками вокруг функций sprintf и atof.

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

Спасибо.

Ответы [ 2 ]

3 голосов
/ 22 апреля 2010

Я следовал за хлебными крошками из ссылки Википедии Йоханнеса Ресселя и нашел реализацию Python, которая не должна быть слишком трудной для перевода: http://groups.google.com/group/comp.lang.python/browse_thread/thread/42150ccc20a1d8d5/4aadc71be8aeddbe

Вот документация формата от Бенгта Рихтера по этой ссылке:

Согласно старому руководству для программиста MASM 5.0, существовал двоичный формат Microsoft для кодирования действительных чисел, как коротких (32 бита), так и длинных (64 бита).

Было 3 части:

  1. Смещенный 8-битный показатель в старшем байте (последний в представлении с прямым порядком байтов, которое мы использовали) Он говорит, что смещение составляет 0x81 для коротких номеров и 0x401 для длинных, но я не уверен, где это выстраивается. Я только что получил экспериментально.

  2. Бит знака (0 для +, 1 для -) в старшем бите второго старшего байта.

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

MASM также поддерживает 10-байтовый формат, аналогичный IEEE. Я не видел ничего в этом разделе на NaNs и INFS.

2 голосов
/ 22 апреля 2010

На основании ответа Йоханнеса вы можете перейти к http://support.microsoft.com/kb/140520, чтобы загрузить исходный код для преобразования .dll из mbf в IEEE.

РЕДАКТИРОВАТЬ: На самом деле это не полезно для вас. Но фактический формат MBF задокументирован здесь: http://support.microsoft.com/kb/35826:

  -------------------------------------------------
 |              |    |                             |
 |8 Bit Exponent|Sign|   55 Bit Mantissa           |
 |              | Bit|                             |
  -------------------------------------------------
...