Чи існує програмне забезпечення, яке може автоматично генерувати числові точні процедури з плаваючою точкою C з символічних формул?


25

Враховуючи реальну функцію реальних змінних, чи доступне програмне забезпечення, яке може автоматично генерувати числовий точний код для обчислення функції на всіх входах на машині, оснащеній арифметикою IEEE 754?

Наприклад, якщо реальна функція, яку слід оцінювати, була:

f (a, b, c) = \ frac {-b - \ sqrt {b ^ 2 - 4ac}} {2a}

Програмне забезпечення розглядає катастрофічне скасування та, можливо, пошук таблиць виходів для певних наборів входів, щоб уникнути втрати обчислювальної точності.

Крім того, чи існує програмне забезпечення, яке може генерувати чисту процедуру пошуку на основі таблиць для обчислення заданої функції з високою точністю?


5
Важка проблема загалом.
dmckee

1
Якщо проблема стосувалася конкретно обчислення (або факторизації) поліномів, є кілька бібліотек C (або C ++).
моала

2
Ви можете перевірити чудову серію статей Річарда Гарріса в журналі ACCU Overload about The Floating Point Blues . Я індексував їх на Programmers.SX для людей, які можуть бути зацікавлені.
Марк Бут

Відповіді:


25

Найкраще рішення, про яке я знаю, - це запрограмувати символічні вирази в Mathematica , Maple або SymPy ; всі посилання переходять безпосередньо до документації про генерацію коду. Всі перераховані вище програми можуть генерувати код на C або Fortran.

Жодна з вищезгаданих програм не згадує точність в арифметиці IEEE 754; загалом, важко було б передбачити всі джерела катастрофічного скасування, як зазначає @dmckee. Важко замінити людський досвід у числовому аналізі.

Щоб навести конкретний приклад, розглянемо обчислення тригонометричних функцій з високою точністю для довільних входів у . Для цього існує багато стратегій, деякі навіть залежать від апаратних засобів, як це бачиться у статті Вікіпедії Тригонометричні таблиці . Усі алгоритми вимагають винахідливості та чисельного аналізу, навіть алгоритми, які залежать від таблиць пошуку та серії Тейлора або інтерполяції (див. Статтю Вікіпедії «Дилема розробника таблиць» ). Більш детально див. Відповідне запитання про переповнення стека. Як працюють тригонометричні функції? .[0,2π]

Програмне забезпечення, яке генерувало код або підпрограми для обчислення довільних функцій з високою точністю, не тільки повинно було знати про помилки скасування, але і наближати рядів (Тейлор, Паде, Чебишев, раціональний тощо) для обчислення функцій, які не визначені в термінах кінцеве число додавання, віднімання, множення, ділення та зсуву бітів. (Див. Теорію наближення .)


4
"Важко замінити людський досвід у числовому аналізі". - це одне заслуговує +1.
JM

"Важко" - це не те саме, що "неможливо". Існують "теореми про повну зайнятість" для деяких робочих місць (наприклад, автори-компілятори). Чи є для числових аналітиків?
Псевдонім


14

Якщо ви хочете уявити, наскільки далеко ми знаходимось від такого програмного пакету, перегляньте робочу записку LAPACK 2001 про обчислення обчислень Givens надійно та ефективно . Я б очікував, що більшість неспеціалістів (і багато спеціалістів!) В числовому аналізі здивуються тому, наскільки аналіз пішов на вирішення такої нібито простої проблеми:

f,gCcRsC

R(c,s)[fg]=[css¯c][fg]=[r0]

R(c,s)


1
+1 Це чудовий приклад, дякую. Я думаю, якби існувало рішення для дій, то воно може бути адаптоване до складних чисел.
Даніель Треббіен

Я, мабуть, повинен зазначити, що основна складність полягає не в тому, що s може бути складним, а у тому, щоб уникнути зайвого переливу та / або переливу. Це пов’язано з функцією гіпота: en.wikipedia.org/wiki/Hypot
Джек Поульсон

11

Генерація коду та попередня компіляція математичних виразів стає все більш популярною.

Хоча символьні пакети, такі як SymPy, Mathematica і Maple, можуть включати генерацію коду, я не впевнений, що будь-який з них також важко замислюється над числовими даними.

Є кілька інших проектів, які можна було б розглянути, які цікавляться як символікою, так і числом.

Theano - такий проект, орієнтований на операції масиву. Вони ідентифікують та замінюють деякі операції, які, як відомо, обумовлені числовими умовами. Я не впевнений, що це стосується вашого конкретного випадку, але це варто вивчити.

Спіраль також може бути цікавою для вас. Вони також попередньо компілюють абстрактне синтаксичне дерево, а також розглядають числові проблеми. Вони більше стосуються скалярних операцій (як ваш приклад). Однак вони також досить спеціалізовані для певного домену.

Однак зростання в цій галузі є обнадійливим. Можна бути оптимістичним, що на ваше питання через кілька років буде краща відповідь.


2
Домовились; можливо моя відповідь виявилася занадто песимістичною, оскільки існує багато рішень, що стосуються конкретних доменів, але загальна проблема ... важка.
Джек Поульсон

4

Не взагалі, я сміливо можу сказати, що реалізатор генератора коду в SymPy навіть не намагався = P.

Паоло Бієтінезі розробив метод для отримання доказів стійкості алгоритмів лінійної алгебри, які генеруються за допомогою позначення FLAME Роберта ван де Гейна.

Дивіться цей документ або довшу версію робочої записки .


1

Sage дозволяє виражати формули в Cython (варіант python, що генерує код C); однак у відповідь на ваше більш загальне питання: ні. Розглянемо теорему Райса .

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.