2009-03-30 13 views
9

Eğitim amaçlı bu tuzaklarla oynamak isterim.IEEE 754 tuzaklarını hangi dilde geliştiriciye maruz bırakıyor?

Sayısal hesaptaki varsayılan davranışla ilgili yaygın bir sorun, yanlış bir işlemde ortaya çıkan Nan (veya + -inf) 'yi "özlüyoruz". Varsayılan davranış, hesaplama yoluyla yayılır, ancak bazı işlemler (karşılaştırmalar gibi) zinciri bozar ve Nan'u kaybeder ve tedavinin geri kalanı, algoritmanın önceki adımlarında tekilliği kabul etmeden devam eder.

Bazen bu tür bir olaya tepki verme yollarımız vardır: bir işlevin uzatılması ("0/0 = 12 benim durumumda") veya zaman alanlı simülasyonda adım atmak ve diğer ayarlarla denemeler yapmak yordayıcı, adım büyüklüğü ya da her neyse).

İşte benim sorum şu: IEEE754 tuzaklarını geliştiriciye veren dilleri biliyor musunuz? Bunun için ASM ile uğraşmak istemiyorum.

cevap

0

C ve muhtemelen C++ ya da python gibi bir çok dilden türetilmiştir (dolaylı erişim olabilir). Düşük seviyeli dillerin böyle bir desteği almasını beklemek makul olacaktır.

IEEE 754 numaraları üzerinde çalışmak için çok sayıda komut dosyası ve not içeren http://www.math.utah.edu/~beebe/software/ieee/#c-notes adresine bakın. Özellikle of1.c kayan nokta istisnaları ile ilgilidir. Son olarak, bir grup faydalı bilgi içeren http://grouper.ieee.org/groups/754/reading.html kaynağından.

+0

Biraz daha spesifik olabilir misiniz lütfen? Bu belgeyi bulamadım, bayrakların nasıl değiştirileceğini buldum, ancak nasıl bir tuzak ayarlayacağımı bulamadım: http://www.opengroup.org/onlinepubs/000095399/basedefs/fenv.h.html – nraynaud

+0

Güncelleştirme bağlantıları ile. –

+0

Bağlantılar için teşekkürler. C programına baktıktan sonra (sanırım iyi görünüyordum, fakat tüm bu ön işlemcinin gürültüsünü olumlu buluyorum), bu şekilde ortaya çıkan tuzakları göremiyorum. Ben sadece bayrak manipülasyonunu görüyorum. SIG_FPE işleyicisi, bir platform için bir boşluk durumu gibi görünüyor. – nraynaud

3

olarak bildiğim kadarıyla, sen C++ ve C noktası durum işleme kayan iki seçenek vardır: (çoğu ortamlarda, varsayılan olarak yapmak) noktası istisnalar yüzen maskesi/devre dışı bırakırsanız,

İlk görebilirsiniz Kayan nokta istisnalarının fetestexcept numaralı telefonu arayarak gerçekleşip gerçekleşmediği. fetestexcept, Visual C++ uygulamasında kullanılamaz, ancak MinGW Runtime'ın uygulamasını kolayca çalabilirsiniz. (Bu genel etki alanındadır.) Bir istisna işaretlendikten sonra, feclearexcept çağrılana kadar temizlenmez, böylece herhangi bir istisna oluşturup oluşturmadığını görmek için bir dizi hesaplamanın sonunda fetestexcept'i çağırabilirsiniz. Bu size sorduğunuz tuzakları vermez, ancak NaN veya +/- inf gibi sorunların oluşup oluşmadığını test etmenizi sağlar. İkinci olarak, Linux'ta feenableexcept numaralı telefonu veya Windows'ta _controlfp numaralı telefonu arayarak kayan nokta istisnalarını etkinleştirebilir/maskesini kaldırabilirsiniz. İşletim sisteminin işlemci tarafından oluşturulan bir kayan nokta özel durumunu işleme biçimi işletim sisteminize bağlıdır. Bunu yakalamak ve uygun tepki rutin belirten bayrağı bir sinyal işleyici yüklemek böylece

  • Linux'ta, işletim sistemi, bir SIGFPE sinyal gönderir. Windows
  • , OS, bir __try/__catch C blok veya try/catch blok C++ kullanarak yakalayabilirsiniz bir dil istisna haline işlemci istisna dönüştürmek için Yapılandırılmış özel durum işleme çağırır.
  • Güncelleme: Mac OS X için, this answer açıklandığı gibi, siz (SSE yani devre dışı bırakmayın) xmmintrin.h den _MM_SET_EXCEPTION_MASK kullanarak istisnaları maskesini/mümkün kılmak ve sürece varsayılan derleyici seçeneklerini kullanmak olarak mümkün olmalıdır SIGFPE kullanarak istisnaları yakalayabilmeniz gerekir. Eğer meraklıysanız,

(I this blog posting yılında ++ biraz daha bu ve C ve C diğer kayan nokta konularda yazdım.)

+0

Bu iyi bir nokta, ben sadece bununla oynuyordum ve şanslı olduğumdan beri, 2 platform özellikleriyle bir macdayım: http://www.gnu.org/software/hello/manual/gnulib/ feenableexcept.html http://lists.apple.com/archives/Darwin-dev/2006/Mar/msg00102.html – nraynaud

+0

Eklediğim linkteki bilgiler benim sınırlı testlerimde benim için işe yarıyor gibi görünüyor. –

+0

Mac OS X bağlantısı için teşekkürler, bu çok düzensiz bir işlem yapar, çünkü yalnızca sse türleri için (float ve double) çalışır, ancak uzun double için değil, x87'e özgüdür. Ayrıca, istisnaları etkinleştirmek, tüm işlem için geçerli iş parçacığı için değil, onunla çalışmayı zorlaştırır. – nraynaud

0

Standartın ne olduğundan emin değilim, ancak yararlı olabileceğinden deneyimden ne gördüğümü söyleyebilirim. C++ 'da kodlandım ve NaN'ler bazen en kötü kabusum. Sessiz görünüyorlar ve hesaplamadan sonuna kadar, sadece işe yaramaz bir çıktı elde edene kadar yayılıyorlar. Sık sık NaN'ye neden olan durumları tespit etmek için ek kod oluşturmak zorunda kaldım. Visual C++ 2008 kullanıyorum, bu yüzden bu şekilde IEEE standardını takip etmesini bekliyorum.

+0

evet, tamamen standart. Ancak standart 3 kullanım düzeyini tanımlar 1) NaN ve infs yayma 2) bayraklar kontrol edebilirsiniz 3) yazılım tuzakları. Belki de varsayılan davranışınızı korumak için kullanımınız çok ileri düzeydedir. – nraynaud

0

Maple'ın programlama dili, IEEE-754'e saygılı bir sayısal modele sahiptir ve isterseniz kendi tutucu işleyicilerinizi ayarlamanıza izin verir. İşte bazı bağlantılar şunlardır:

NADİR Maple özelliği, varsayılan kayan nokta sayılarının ondalık (ikili değil) ve isteğe bağlı kesin olmasıdır. 64 bitlik ikili kayan nokta sayılarıyla ilgilenmek isterseniz, bunları HFloat içine sarın. HFloat(0.2) Bu arasındaki farkı hesaplar

a := HFloat(0.2); 
b := 0.2; 
evalf[20](a - b); 

Eğer bu örneğin çalıştırarak belirgindir C bir çift için 0.2 atayarak alacağı aynı sayıda temsil ederken Örneğin 0.2, tam olarak ondalık sayı temsil ettiği 20 ondalık basamaklı aritmetik kullanarak a ve b ve sonuç 0.11E-16.

İlgili konular