기호식에서 수치 적으로 정확한 부동 소수점 C 루틴을 자동 생성 할 수있는 소프트웨어가 있습니까?


25

실제 변수의 실제 기능이 주어지면 IEEE 754 산술이 장착 된 기계에서 모든 입력에 대한 함수를 계산하기 위해 숫자로 정확한 코드를 자동으로 생성 할 수있는 소프트웨어가 있습니까?

예를 들어 평가할 실제 함수가 다음과 같은 경우

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

소프트웨어는 계산 정확도의 손실을 피하기 위해 특정 입력 세트에 대한 치명적인 취소 및 출력 테이블 조회를 고려합니다.

또는 주어진 함수를 높은 정확도로 계산하기 위해 순수한 테이블 기반 조회 루틴을 생성 할 수있는 소프트웨어가 있습니까?


5
일반적으로 어려운 문제입니다.
dmckee

1
문제가 특별히 폴리 놈의 근본 계산 (또는 인수 분해)에 관한 것이라면, C (또는 C ++) 라이브러리가 있습니다.
moala

2
The Floating Point Blues에 대한 ACCU 저널 과부하 에서 Richard Harris의 훌륭한 기사를 확인하고 싶을 것 입니다. 나는 그들을 색인 에 관심이있을 수있는 사람들을 위해 Programmers.SX에 이상.
Mark Booth

답변:


25

내가 아는 가장 좋은 해결책은 Mathematica , Maple 또는 SymPy 에서 기호 표현을 프로그래밍하는 것입니다 . 모든 링크는 코드 생성 문서로 직접 이동합니다. 위의 모든 프로그램은 C 또는 Fortran으로 코드를 생성 할 수 있습니다.

위의 프로그램 중 어느 것도 IEEE 754 산술의 정확성을 언급하지 않습니다. @dmckee가 지적한 것처럼 일반적으로 치명적인 취소의 모든 출처를 예상하기는 어려울 것입니다. 수치 분석에서 인간의 전문 지식을 대체하기는 어렵습니다.

구체적인 예를 제공하기 위해 [ 0 , 2의 임의 입력에 대해 삼각 함수를 높은 정밀도로 계산하는 것을 고려하십시오. Wikipedia 기사Trigonometric Tables에서 볼 수 있듯이 하드웨어에 따라 많은 전략이 있습니다. 모든 알고리즘에는 룩업 테이블과 Taylor 시리즈 또는 보간에 의존하는 알고리즘까지도 독창성과 수치 분석이 필요합니다 (Wikipedia 기사The Table-Maker 's Dilemma 참조). 자세한 내용은 관련 스택 오버플로 질문삼각 함수는 어떻게 작동합니까?를참조하십시오. .[0,2π]

임의의 함수를 높은 정확도로 계산하기 위해 코드 또는 루틴을 생성 한 소프트웨어는 취소 오류를 인식 할 필요가있을뿐만 아니라, 유한 한 수의 덧셈, 뺄셈, 곱셈, 나눗셈 및 비트 시프트. ( 근사 이론 참조 )


4
"숫자 분석에서 인간의 전문 지식을 대체하기는 어렵습니다." -이것만으로도 +1이 필요합니다.
JM

"어려워요"는 "불가능하다"와 같은 것이 아닙니다. 일부 작업 (예 : 컴파일러 작성자)에는 "완전 고용 이론"이 있습니다. 수치 분석가를위한 것이 있습니까?
가명


14

이러한 소프트웨어 패키지와 얼마나 멀리 떨어져 있는지에 대한 아이디어가 필요하면 2001 LAPACK 작업 노트를 참조하십시오. 회전 계산을 신뢰할 수 있고 효율적으로 . 수치 분석에있어 대부분의 비전문가 (및 많은 전문가들)가 그러한 간단한 표면적 문제를 해결하는 데 얼마나 많은 분석이 수행되었는지에 놀랄 것으로 기대합니다.

주어진 , c Rs C 찾기에프,기음기음아르 자형에스기음 그러한

,

아르 자형(기음,에스)[에프]=[기음에스에스¯기음][에프]=[아르 자형0]

여기서 는 단일입니다. 연속성과 같은 더 미묘한 문제와 함께 계산 효율성과 안정성의 균형을 맞추는 것은 매우 사소한 일이며 앞으로는 자동화되지 않을 것입니다.아르 자형(기음,에스)


1
+1 좋은 예입니다. 감사합니다. 실수에 대한 솔루션이 존재하면 복잡한 숫자에 적합 할 수 있습니다.
Daniel Trebbien

나는 근본적인 어려움이 복잡 할 수 있다는 사실이 아니라 불필요한 오버플로 및 / 또는 언더 플로를 피하는 데 있다고 언급해야한다. 그것은 hypot 기능과 관련이 : en.wikipedia.org/wiki/Hypot
잭 폴슨을

11

수학 표현의 코드 생성 및 사전 컴파일이 점점 대중화되고 있습니다.

SymPy, Mathematica 및 Maple과 같은 기호 패키지에는 코드 생성이 포함될 수 있지만 그 중 어느 것도 숫자에 대해 열심히 생각한다고 확신하지 않습니다.

심볼릭과 숫자에 관심이있는 다른 프로젝트가 몇 가지 있습니다.

Theano 는 어레이 작업에 중점을 둔 프로젝트입니다. 수치 적으로 잘못 알려진 것으로 알려진 일부 작업을 식별하고 대체합니다. 특정 사례가 포함되어 있는지 확실하지 않지만 조사 할 가치가 있습니다.

나선형 도 흥미로울 수 있습니다. 또한 추상 구문 트리를 미리 컴파일하고 숫자 문제도 찾습니다. 스칼라 연산 (예 : 예)과 더 관련이 있습니다. 그러나 그들은 또한 특정 도메인에 상당히 전문화되어 있습니다.

그러나이 분야의 성장은 고무적입니다. 몇 년 안에 귀하의 질문에 더 나은 답변이있을 것이라고 낙관 할 수 있습니다.


2
합의 아마도 도메인 고유의 솔루션이 많기 때문에 내 대답이 너무 비관적이지만, 일반적인 문제는 ... 단단합니다.
Jack Poulson

4

일반적으로 SymPy의 코드 생성기 구현자는 = P조차 시도하지 않았다고 안전하게 말할 수 있습니다.

Paolo Bientinesi는 Robert van de Geijn의 FLAME 표기법을 사용하여 생성 된 선형 대수 알고리즘의 안정성 증명을 생성하는 방법을 개발했습니다.

이 문서 또는 더 긴 작업 노트 버전을 참조하십시오 .


1

Sage를 사용하면 Cython (C 코드를 생성하는 python의 변형)으로 수식을 표현할 수 있습니다. 그러나 더 일반적인 질문에 대한 답으로 : 아니오. 쌀의 정리를 고려하십시오 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.