SORU
14 EKİM 2009, ÇARŞAMBA


Tüm karşılaştırmalar İEEE754 NaN değerler için yanlış dönen gerekçesi nedir?

Neden NaN değerlerin karşılaştırmaları farklı tüm diğer değerlerden mi davranır? Yani, operatörler ile tüm karşılaştırmalar ==, <=, >= , &;, ^ lt . ya da her iki değer bir NaN döndürür false olduğu, diğer bütün değerlerin davranışlara aykırı.

Bu bir şekilde sayısal hesaplamalar kolaylaştırır sanırım, ama açıkça belirtildiği bir sebep bile ayrıntılı diğer tasarım kararları ele alan Kahan tarafından Lecture Notes on the Status of IEEE 754 bulamadım.

Bu sapkın davranış, basit veri işleme yaparken sorun yaratmaya devam ediyor. Örneğin, kayıtları w listesini sıralarken.r.t. maksimal elemanı olarak NaN işlemek için ekstra kod yazmak gerekiyor, aksi halde karıştı haline gelebilir C programında gerçek değere sahip bir alan var.

Düzenleme: Cevapları şu ana kadar NaNs karşılaştırmak anlamsız olduğunu savunuyorlar.

Ama doğru cevap yanlış olduğu anlamına gelmez,kabul ediyorum -Boolean (Yakala), neyse ki yok olan bir şey olurdu doğrusu.

Karşılaştırma için doğru veya yanlış dönen seçim benim görünüm keyfi,Bu kadar ve genel veri işleme için ise her zamanki yasalarına itaat avantajlı olurdu ( = = , < kısma bölünen bu deneyimlerin yaşanabileceğini;, ==, >), bu yasalara güvenmek diye veri yapıları birbirine karışabilir.

Bu yasayı ihlal eden somut bir avantaj değil, sadece felsefi akıl yürütme için soruyorum.

Edit 2: Şimdi NaN maksimal kötü bir fikir olacağını anlıyorum, üst limit hesaplama bozmak istemiyorum.

NaN=! NaN bir döngü gibi yakınsama tespit önlemek için uygun olabilir

while (x != oldX) {
    oldX = x;
    x = better_approximation(x);
}

ancak daha küçük bir sınır ile mutlak farkı karşılaştırarak yazılması gerekir. Yani IMHO.

CEVAP
15 EKİM 2009, PERŞEMBE


IEEE-754 Komitesi üyesi, şeyleri açıklığa kavuşturmak için çalışacağım biraz.

İlk olarak, kayan nokta sayılar gerçek sayılar ve kayan noktalı aritmetik gerçek aritmetik aksiyomlarını tatmin etmez. Üçe bölünme yüzer, ne de olsa en önemli için de geçerli değil bu gerçek aritmetik tek özellik değil. Örneğin:

  • Ayrıca değil ilişkilendirilebilir.
  • Dağıtıcı Kanun tutmaz.
  • Tersler olmadan kayan nokta numaraları vardır.

Devam edebilirim. Mümkün karşılayan sabit boyutlu aritmetik bir tür belirtmek için değildirtümbildiğimiz ve sevdiğimiz gerçek aritmetik özellikleri. 754 Komitesi karar vermek ya da bazıları viraj kırmak için vardır. Bu oldukça basit bazı İlkeleri tarafından yönlendirilir:

  1. Biz, gerçek aritmetik davranışını biz maç.
  2. Değil, ihlalleri olarak tahmin edilebilir hale getirmek için çalışın ve mümkün olan en kolay olarak teşhis edebiliriz.

Senin yorumun "doğru cevap yanlış olduğu anlamına gelmez", bu yanlış. ilgili Yüklem (y < x) y x daha az olup olmadığını sorar. Eğer y NaN ise, o zamandeğilkayan nokta herhangi bir değerden daha az x, o yüzden mutlaka cevap yanlış.

Üçe bölünme kayan nokta değerleri için de geçerli değil bu bahsettiğim. Ancak, geçerli olan benzer bir özelliği var. 754-2008 standart 5.11, paragraf 2 fıkra:

Özel ilişkiler mümkün olan karşılıklı dört: daha az, daha büyük, eşit ve sırasız. Son durumda en az bir işlenen NaN olduğunda ortaya çıkar. Her NaN her şeyi, kendisi de dahil olmak üzere sırasız karşılaştırmak olacaktır.

Bildiğim kadarıyla fazladan kod yazmak için bir tanıtıcı NaNs gider, genellikle mümkün değil, her zaman kolay) yapısı kodunuzu şekilde NaNs sonbahar boyunca doğru, ama bu değil her zaman böyle. Yok, fazladan kod değil zaman gerekli olabilir, ama bu cebirsel kapatma-kayan nokta aritmetiği için getirdiği kolaylık sağlamak için küçük bir bedel.


Ek: Birçok ziyaretçi gerekçesiyle NaN != benimseyen eşitlik ve üçe bölünme bu deneyimlerin yaşanabileceğini korumak için daha yararlı olacağını savundular NaN tanıdık bir aksiyom korumak için görünmüyor. Bu bakış açısı için bazı sempati ettiğimi itiraf ediyorum, bu cevap, tekrar ve biraz daha fazla bağlam sağlamak düşündüm.

Kahan konuşurken anladığım NaN != NaN iki pragmatik hesapları nedeniyle köken:

  • x == y olmalı eşdeğer x - y == 0 mümkün olduğunda (ötesinde bir varlık teoremi gerçek aritmetik, bu donanım uygulaması karşılaştırıldığında, daha az yer kaplayan, olan oldu son derece önemli zaman standart geliştirdi — not, ancak, bu ihlal için x = y = sonsuz değil, o yüzden bir büyük nedeni kendi kendine; olabilir makul bir süredir bent x - y == 0 or NaN).

  • daha da önemlisi, hiçbir " isnan( ) yüklem, zaman, o NaN oldu resmi olarak 8087 aritmetik; oldu gerekli sağlamak programcılar ile uygun ve etkin şekilde tespit NaN değerleri yoktu bağlıdır programlama dilleri sağlayan bir şey gibi isnan( ) hangi yıllar alabilir. Konuyla ilgili Kahan kendi yazımı alıntı yapacağım:

Vardı hiçbir şekilde kurtulmak NaNs, onlar-cekti var olmak işe yaramaz İndefinites üzerinde CRAYs; en kısa sürede bir edildi karşılaştı, hesaplama iyi olurdu durdu ziyade devamı için belirsiz bir süre için Belirsiz bir sonuç. O NaNs üzerine bazı işlemler non-NaN sonuçlar. Hangi operasyon? ... Özel durumlar C doğrulamaları “ x = x “ x=! ” x ”, sırasıyla 1 ve 0 için her sonsuz veya sonlu sayıda x ama tersine, eğer x bir Sayı Değil ( NaN ); bu verdiğiniz sadece basit sıradan bir ayrım arasında NaNs ve sayıda dilde eksik olan bir kelime için NaN ve bir yüklem İsNaN(x).

Bu da öyle bir şey iade kuralları mantığı olduğunu unutmayın “Değildir " Boolean”. Belki de bu pragmatizm oldu yersiz ve standart olması gerekli isnan( ) ama yapılmış olur NaN neredeyse imkansız kullanmak verimli ve rahat ulaşım için birkaç yıl süre bekledi dünya için programlama dili olarak benimsenmesi. Makul bir takas olurdu emin değilim.

Açık sözlü olmak gerekirse: = = NaN şimdi değiştirmeyecek NaN sonucu. Daha iyi internet üzerinden şikayet etmek daha birlikte yaşamayı öğrenmek. Bir sipariş ilişkisi kaplar için uygundur gerektiğini savunuyorlarayrıcavar, en sevdiğiniz programlama dili totalOrder yüklem IEEE-754 (2008) standart uygulayan savunan tavsiye ederim. Zaten Kahan geçerliliğini konuşuyor değil mi aslında işlerin mevcut durumu motive endişe.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Bryan Adams

    Bryan Adams

    30 Mart 2006
  • Facebook Developers

    Facebook Dev

    24 ŞUBAT 2009
  • Troy Hunt

    Troy Hunt

    29 EYLÜL 2011