У меня была проблема, когда я пытался восстановить формулу, используемую в существующей системе, довольно простая формула одного входа и одного выхода:
y = f(x)
После многого недоумения нам удалось выяснить формулу, которая соответствует нашим наблюдаемым точкам данных:
И как вы можете видеть, наша теоретическая модель очень хорошо подходит к наблюдаемым данным:
За исключением случаев, когда мы строим остаточные ошибки (т.е. y = f(x) - actualY
), мы видим, что в остатках появляются строки:
Было очевидно, что эти линии были результатом применения некоторого промежуточного округления в нашей формуле, но не было очевидным, где. В конце концов было осознано, что система оригинал (та, которую мы пытаемся перестроить) хранит значения в промежуточном типе Decimal
:
- с 8-битной точностью фракции
- используя округлую модель 0,5 округления:
Мы могли бы имитировать эту 8-битную точность во фракции:
multiply by 128 (i.e. 2^8)
apply the round
divide by 128 (i.e. 2^8)
Изменение нашего уравнения выше:
Это значительно уменьшает остаточные ошибки:
Теперь все вышеизложенное не имеет отношения к моему вопросу, кроме:
- Чтобы показать, что симуляция численного представления на компьютере может помочь модели
- Чтобы привлечь внимание людей к красивым изображениям и цветам
- Критики молчания, которые могли бы отказаться от внести пока я объяснить, почему я задаю свой вопрос
Теперь я хочу симулировать числа с плавающей запятой Single Precision
, внутри языка программирования (и Excel), которые используют числа с плавающей запятой Double Precision
. я хочу сделать это, потому что я думаю, это то, что нужно.
В приведенном выше примере я мысль исходная система использовала Decimal data type with fixed 8-bit fractional precision using 0.5 round-up rules
. Затем мне пришлось найти способ имитировать эту вычислительную модель с помощью Double
math. Теперь я думаю, что исходная система использует математику точности Single
, которую я хочу имитировать с помощью Double
.
Как имитировать одноточечное округление с использованием удвоений?
В моей текущей модели у меня снова есть остатки, которые попадают в обычные линейные шаблоны - это контрольный знак округления:
Проблема заключается в том, что ошибка становится больше и только видна, поскольку мои входные переменные становятся больше. я понял, что это, вероятно, связано с тем, что все числа с плавающей запятой нормированы на IEEE 754 "научная нотация".
И даже если я ошибаюсь, я все же хочу попробовать.
И даже если я не хочу его пытаться, я все еще задаю вопрос
Как смоделировать округление точности
Single
с помощьюDoubles
?
Мне кажется, я все еще мог применить понятие "округление после 8 дробных бит" (хотя 24 бит для точности Single
с плавающей запятой), пока я могу сначала "нормализовать" значение. например.
1234567898.76543
необходимо преобразовать в (что-то похожее):
1.23456789876543 E-09
Затем я мог применить свой "круглый к 24-му биту" (т.е. 2 ^ 24 = 16 777 216)
floor(1.23456789876543E-09 * 16777216 + 0.5) / 16777216;
Таким образом, проблема заключается в том, какая комбинация sign
, abs
, ln
, exp
(или других функций) может применяться, чтобы я мог "нормализовать" мое значение, округлить его до n-м двоичное место, затем "denormalize" это?
Примечание: я понимаю, что представление IEEE хранит двоичный 1
как самый старший бит. мне может не понадобиться дублировать это поведение, чтобы получить правильные результаты. Таким образом, это не прерыватель транзакций, и не следует предполагать, что весь подход является провалом.