Эмуляция умножения / сложения с плавающей точкой IBM в VBA - PullRequest
5 голосов
/ 22 октября 2010

Я пытаюсь эмулировать (больше не существует) генератор отчетов мэйнфреймов в среде Access 2003 или Access 2010. Генерируемые им данные должны точно соответствовать бумажным отчетам начала 70-х годов. К сожалению, данные самых ранних лет использовались на оборудовании, которое использовало представление IBM с плавающей запятой вместо IEEE. С помощью Google я нашел библиотеку функций VBA, которые преобразуют число с плавающей запятой в 32-битный двоичный формат IEEE 754. Мне пришлось изменить библиотеку так, чтобы она принимала 32-битные или 64-битные числа с плавающей запятой, поэтому у меня есть скромные практические знания о форматах с плавающей запятой, однако у меня возникают проблемы с преобразованием из IEEE в двоичный формат IBM, а также проблемы с умножением и добавлением либо номера IBM или IEEE.

У меня не было никаких других библиотек для выполнения этого преобразования и арифметических операций в VBA - есть ли более простой способ сделать это или существующая библиотека, которую я не нахожу? В противном случае, ясное и прямое объяснение соответствующих алгоритмов?

Заранее спасибо.

Ответы [ 2 ]

2 голосов
/ 29 октября 2010

Если честно, вам лучше начать с эмулятора Геркулеса.http://www.hercules -390.org / Кроме теоретически, с VBA вы можете использовать тип Decimal для получения хороших результатов (обратите внимание, что для их создания вам нужно использовать CDec), он использует 12 битов с переменной степеньюдесять скаляров.

Быстрый гугл показывает этот пост из группы hercules, что подтверждает мнение Альбертса о необходимости знать аппаратное обеспечение:

--- Snip -

Теоретически, а на практике гораздо меньше.S / 360 и S / 370 имели выбор научных или коммерческих наборов инструкций.Первый добавил инструкции FP и регистры к базе;последние десятичные инструкции, включая Edit и Edit & Mark.Но большие модели 360 (iirc / 65 и выше) и 370 (/ 155 и выше) имели объединение двух, называемое универсальным набором команд, и в какой-то момент S / 370 отказался от этой опции.

--- snip ---

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

1 голос
/ 23 октября 2010

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

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

Однако и одинарные, и двойные значения, доступные внутри доступа, на самом деле имеют одинаковый формат и соответствуютстандарту IEEE с плавающей запятой.

Для единственной переменной доступа это 32-битное число, а диапазон:

-3.402823E38 
    to 
-1.401298E-45 for negative values

и

1.401298E-45 
    to 
3.402823E38 for positive values

Товыглядит для меня так же, как и стандарт IEEE 754.

Так что, если вы добавляете значения в access как единое целое, вы должны получить одинаковые результаты при разбивке.

Итак, на основе Intelи Access одинарные и двойные, я полагаю, совпадают с этим стандартом IEEE.

Единственная реальная проблема, и вот в чем заключается формат исходных данных, к которым вы получаете доступ, и какие типы текстаили когда происходит извлечение и хранение данных, происходит процесс преобразования строки?

Доступ может конвертировать числа.Попробуйте ввести эти значения в командной строке доступа (окно отладки)

 ? hex(255)
     Above will show  FF

 ? csng(&hFF)
     Above will show 255

Редактировать:

Ах, хорошо, теперь я вижу, что это неправильно, моя ошибка здесь.Проблема здесь заключается в том, что если вы преобразуете число в более старый формат IBM (Excess 64?), Вам придется ПОЛУЧИТЬ их код, который они использовали для добавления этих чисел.Фактически, даже тогда разные модели IBM в зависимости от того, что вы приобрели, на самом деле давали разные результаты (больше денег = больше точности).

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...