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


25

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

Например, если реальная функция для оценки была:

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

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

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


5
Сложная проблема в целом.
dmckee

1
Если проблема заключалась, в частности, в вычислении корня (или факторизации) полиномов, то существуют некоторые библиотеки C (или C ++).
Моала

2
Возможно, вы захотите проверить превосходную серию статей Ричарда Харриса в журнале ACCU Overload о блюзе с плавающей точкой . Я проиндексировал их на Programmers.SX для людей, которые могут быть заинтересованы.
Марк Бут

Ответы:


25

Лучшее из известных мне решений - это программирование символических выражений в Mathematica , Maple или SymPy ; все ссылки ведут непосредственно на документацию по генерации кода. Все вышеперечисленные программы могут генерировать код на C или Fortran.

Ни одна из вышеперечисленных программ не упоминает точность в арифметике IEEE 754; в общем, было бы трудно предвидеть все источники катастрофической отмены, как отмечает @dmckee. Трудно заменить человеческий опыт в численном анализе.

[0,2π]

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


4
«Трудно заменить человеческий опыт в численном анализе». - это одно заслуживает +1.
JM

«Это сложно» - это не то же самое, что «невозможно». Существуют «теоремы полной занятости» для некоторых заданий (например, авторы компиляторов). Есть ли один для числовых аналитиков?
Псевдоним


14

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

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.