Sayısal olarak doğru kayan nokta C rutinlerini sembolik formüllerden otomatik olarak oluşturabilen bir yazılım var mı?


25

Gerçek değişkenlerin gerçek bir işlevi göz önüne alındığında, IEEE 754 aritmetiği ile donatılmış bir makinedeki tüm girdiler üzerindeki işlevi hesaplamak için otomatik olarak sayısal olarak doğru kod üretebilen bir yazılım var mı?

Örneğin, değerlendirilecek asıl işlev şuysa:

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

Yazılım, hesaplamalı doğruluk kaybını önlemek için felaket iptalini ve bazı girdi kümeleri için muhtemel çıktı tablosu aramalarını dikkate alacaktır.

Alternatif olarak, belirli bir işlevi yüksek doğrulukla hesaplamak için saf bir masa bazlı arama rutini üretebilen bir yazılım var mı?


5
Genel olarak zor bir problem.
dmckee

1
Eğer sorun özellikle polinomların kök hesaplaması (veya çarpanlara ayırma) ile ilgiliyse, orada bazı C (veya C ++) kütüphaneleri var.
moala

2
Richard Harris'in ACCU dergisindeki Overload The The Floating Point Blues hakkındaki mükemmel yazılarına göz atmak isteyebilirsiniz . Ben onları endeksli ilgi olabilecek kişiler için Programmers.SX üzerinde bitti.
Mark Booth,

Yanıtlar:


25

Bildiğim en iyi çözüm, Mathematica , Maple veya SymPy'deki sembolik ifadeleri programlamak ; tüm bağlantılar doğrudan kod oluşturma dokümantasyonuna gider. Yukarıdaki programların tümü C veya Fortran'da kod üretebilir.

Yukarıdaki programların hiçbiri, IEEE 754 aritmetiğindeki doğruluğu ifade etmemektedir; Genel olarak, @dmckee'nin belirttiği gibi bütün felaket iptali kaynaklarını önceden tahmin etmek zor olacaktır. Sayısal analizde insan uzmanlığının yerini almak zor.

Somut bir örnek vermek gerekirse, içindeki rasgele girişler için trigonometrik fonksiyonları yüksek hassasiyetle hesaplamayı düşünün . Vikipedi Trigonometrik Tablolar makalesinde görüldüğü gibi, bazı hatta donanım bağımlı, bunu yapmak için birçok strateji vardır . Tüm algoritmalar yaratıcılık ve sayısal analiz gerektirir, hatta arama tablolarına ve Taylor serisine veya enterpolasyonuna bağlı olan algoritmalar bile (Wikipedia'daki The The Tablo-Maker's Dilemma makalesine bakın ). Daha fazla ayrıntı için ilgili Yığın Taşması sorusuna bakın Trigonometrik Fonksiyonlar nasıl çalışır? .[0,2π]

Rasgele işlevleri yüksek doğrulukla hesaplamak için kod veya yordamlar üreten yazılımlar, yalnızca iptal hatalarının farkında olmakla kalmayıp, aynı zamanda, sınırlı sayıda toplama, çıkarma, çarpma, bölme ve bit kaydırma. (Bkz. Yaklaşım Teorisi .)


4
“Sayısal analizde insan uzmanlığının yerini almak zor.” - bu tek başına bir + 1 hak ediyor.
JM,

“Zor”, “imkansız” ile aynı şey değil. Bazı işler için "tam istihdam teoremleri" vardır (örneğin, derleyici yazarları). Sayısal analistler için bir tane var mı?
takma


14

Böyle bir yazılım paketinden ne kadar uzakta olduğumuz hakkında bir fikir edinmek istiyorsanız, lütfen Givens rotasyonlarını güvenilir ve verimli bir şekilde hesaplamak için 2001 LAPACK çalışma notuna bakın . Sayısal analizde uzman olmayanların (ve birçok uzmanın!) Çoğunun, görünüşte basit bir sorunu çözmek için ne kadar analiz yapıldığına şaşırmasını beklerdim:

f,gCcRsC

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

R(c,s)


1
+1 Bu harika bir örnek, teşekkür ederim. Sanırım gerçekler için bir çözüm varsa, o zaman karmaşık sayılara uyarlanabilir.
Daniel Trebbien,

Muhtemelen, temel zorluğun karmaşık olabileceği gerçeğinden değil, gereksiz taşma ve / veya akıştan kaçınma olduğunu söylemeliyim. Hipot fonksiyonuyla ilgilidir: en.wikipedia.org/wiki/Hypot
Jack Poulson

11

Kod oluşturma ve matematiksel ifadelerin önceden derlenmesi daha popüler hale geliyor.

SymPy, Mathematica ve Maple gibi sembolik paketler kod üretmeyi içerebilirken, hiçbirinin de sayısal hakkında fazla düşünmeyeceğinden emin değilim.

Hem sembolik hem de sayısal konularla ilgilenebilecek bir kaç proje daha var.

Theano , dizi işlemlerine odaklanmış böyle bir projedir. Sayısal olarak şartlandırılmadığı bilinen bazı işlemleri belirler ve değiştirir. Bunun sizin davanızı içerdiğinden emin değilim, ancak araştırmaya değer.

Spiral de senin için ilginç olabilir. Ayrıca, soyut bir sözdizimi ağacını önceden derlerler ve sayısal konulara da bakarlar. Skaler işlemlerle daha çok ilgilenirler (örneğin sizin örneğiniz gibi). Ancak, belirli bir alan için de oldukça uzmanlaşmıştır.

Bununla birlikte, bu alandaki büyüme cesaret vericidir. Bir kaç yıl içinde sorunuzun daha iyi bir cevabı olacağı konusunda iyimser olabilir.


2
Kabul; belki de cevabım çok kötümser bir biçimde ortaya çıktı, etki alanına özel çözümler olduğu için genel sorun ... zor.
Jack Poulson,

4

Genel olarak, güvenli bir şekilde kod üretecinin SymPy'deki uygulayıcısının = P bile denemediğini söyleyebilirim.

Paolo Bientinesi, Robert van de Geijn'in FLAME notasyonu kullanılarak oluşturulan lineer cebir algoritmalarının kararlılık kanıtlarını üretmek için bir yöntem geliştirdi.

Bkz Bu kağıdı veya daha uzun, çalışma notu versiyonunu .


1

Sage , Cython'da (C kodu üreten bir python çeşidi) formülleri ifade etmenize olanak sağlar; ancak, daha genel sorunuza cevaben: hayır. Rice Teoremini düşünün .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.