В задаче «Движение трех тел» столкнулся с проблемой потери данных во время сложения переменных с плавающей точкой, у которых порядок значительно отличается. Оказывается решить эту проблему можно, разделив переменную на старшую (HIGH) и младшую (LOW) части. Операции сложения и вычитания выполняются так: 1. Сложение LOW и запись во временную переменную WRKL. 2. Сложение HIGH и запись во временную переменную WRKH. 3. Вычисление разности порядков DifOrd = order(WRKH) – order(WRKL) 4. Цикл, пока DifOrd > 0 5. WRKH = WRKH + 2^DifOrd 6. WRKL = WRKL - 2^DifOrd 7. DifOrd = order(WRKH) – order(WRKL) 8. Конец цикла Для понимания подпрограммы на языке Ассемблер примем следующие обозначения: Src1 – первое слагаемое; Src2 – второе слагаемое; Wrk – временная переменная; Ord – временная переменная; .Low – младшая часть числа; .High – старшая часть числа; Теперь несложно выполнить алгоритм сложения: Fld Src1.Low ; загрузить младшую часть слагаемого 1 Fadd Src2.Low ; прибавить младшую часть слагаемо
Решение одной проблемы численного интегрирования при накоплении малых приращений.
10 октября 202310 окт 2023
6
1 мин