IEEE-754 komitesinin üyesiydim, işleri biraz açıklığa kavuşturmaya yardımcı olacağım.
İlk olarak, kayan nokta sayıları gerçek sayılar değildir ve kayan nokta aritmetiği gerçek aritmetiğin aksiyomlarını karşılamaz. Trikotomi, gerçek aritmetiğin yüzer için geçerli olmayan tek özelliği değil, hatta en önemlisi değildir. Örneğin:
- Toplama çağrışımsal değildir.
- Dağıtım kanunu geçerli değildir.
- Tersine çevrilmemiş kayan nokta sayıları vardır.
Devam edebilirdim. Bildiğimiz ve sevdiğimiz gerçek aritmetiğin tüm özelliklerini karşılayan sabit boyutlu bir aritmetik türü belirtmek mümkün değildir . 754 komitesi bazılarını bükmeye veya kırmaya karar vermek zorundadır. Bu, bazı oldukça basit ilkeler tarafından yönlendirilmektedir:
- Mümkün olduğunda, gerçek aritmetik davranışını eşleştiriyoruz.
- Yapamadığımızda, ihlalleri mümkün olduğunca öngörülebilir ve teşhis edilmesi kolay hale getirmeye çalışıyoruz.
"Bu doğru cevabın yanlış olduğu anlamına gelmez" yorumuna gelince, bu yanlıştır. Yüklem daha küçük (y < x)
olup olmadığını sorar . Eğer NaN ise, o zaman olduğu değil herhangi kayan nokta değerinden düşük cevap mutlaka yanlıştır yüzden.y
x
y
x
Trikotominin kayan nokta değerleri için geçerli olmadığını belirttim. Ancak, benzer bir özellik var. 754-2008 standardının 5.11, 2. paragrafı:
Dört birbirini dışlayan ilişki mümkündür: küçük, eşit, büyük ve düzensiz. Son durum, en az bir işlenen NaN olduğunda ortaya çıkar. Her NaN sıralamasız olarak kendisi de dahil olmak üzere her şeyi karşılaştırır.
NaN'leri işlemek için ekstra kod yazarken, kodunuzu NaN'lerin düzgün bir şekilde düşeceği şekilde yapılandırmak genellikle (her zaman kolay olmasa da) mümkündür, ancak bu her zaman böyle değildir. Değilse, bazı ekstra kodlar gerekli olabilir, ancak bu, cebirsel kapanışın kayan nokta aritmetiğine getirdiği rahatlığı ödemek için küçük bir fiyattır.
Zeyilname: Birçok yorumcu, NaN! = NaN'ı benimsemenin, bilinen herhangi bir aksiyomu korumadığı görülmediği gerekçesiyle, eşitlik ve trikotominin refleksivitesini korumanın daha yararlı olacağını savunmuştur. Bu bakış açısına sempati duyduğumu itiraf ediyorum, bu yüzden bu cevabı tekrar gözden geçirip biraz daha fazla bağlam sunacağımı düşündüm.
Kahan'la konuşmamdaki anlayışım NaN! = NaN'nin iki pragmatik düşünceden kaynaklandığı yönündedir:
Bu mümkün olduğunda x == y
eşdeğer olmalıdır x - y == 0
(gerçek aritmetik teoremi olmanın ötesinde, bu, donanımın uygulanmasını daha fazla yer verimli hale getirir, bu da standardın geliştirildiği zaman çok önemlidir - ancak bunun x için ihlal edildiğine dikkat edin. = y = sonsuzluk, bu yüzden tek başına büyük bir neden değil; makul bir şekilde bükülmüş olabilir (x - y == 0) or (x and y are both NaN)
).
Daha da önemlisi, isnan( )
NaN'nin 8087 aritmetiğinde resmileştirildiği sırada hiçbir belirti yoktu ; programcılara, programlama dillerine bağlı olmayan ve isnan( )
uzun yıllar alabilecek bir şey sağlayan NaN değerlerini tespit etmek için uygun ve etkili bir yol sağlamak gerekiyordu. Kahan'ın konuyla ilgili kendi yazılarını alıntılayacağım:
NaN'lerden kurtulmanın bir yolu olmasaydı, bunlar CRAY'lardaki belirsizlikler kadar işe yaramazdı; karşılaşır karşılaşmaz, belirsiz bir sonuca belirsiz bir süre devam etmek yerine hesaplama en iyi şekilde durdurulacaktır. Bu yüzden NaN'ler üzerindeki bazı operasyonlar NaN dışı sonuçlar vermelidir. Hangi operasyonlar? … İstisnalar, C, "x == x" ve "x! = X" tahminlerini içerir; bunlar, her sonsuz veya sonlu x sayısı için sırasıyla 1 ve 0'dır, ancak x, bir Sayı Değil (NaN) ise tersidir; bunlar, NaN'ler ve NaN için bir kelime içermeyen dillerdeki bir sayılar ve isNaN (x) arasındaki tek basit istisnai ayrımı sağlar.
Bunun aynı zamanda “A-Boolean Değil” gibi bir şeyi döndürmeyi engelleyen mantık olduğunu da unutmayın. Belki de bu pragmatizm yanlış yerleştirilmişti ve standardın zorunlu olması gerekirdi isnan( )
, ancak bu, dünya dilinin benimsenmesini programlamayı beklerken, NaN'yi birkaç yıl boyunca verimli ve rahat bir şekilde kullanmak neredeyse imkansız olurdu. Bunun makul bir ödünleşme olacağına ikna olmadım.
Açık konuşmak gerekirse: NaN == NaN sonucu artık değişmeyecek. Onunla yaşamayı öğrenmek internette şikayet etmekten daha iyidir. Kaplar için uygun bir sipariş ilişkisinin de olması gerektiğini iddia etmek isterseniz , favori programlama dilinizin totalOrder
IEEE-754 (2008) 'de standartlaştırılmış yüklemi uygulamasını tavsiye etmenizi öneririm . Şu anda Kahan'ın mevcut durumu motive eden endişesinin geçerliliğinden bahsetmemiş olması.
while (fabs(x - oldX) > threshold)
yakınsama meydana gelirse veya bir NaN hesaplamaya girerse döngüden çıkarak benzer bir şey olur. NaN'nin tespiti ve uygun çözüm, döngü dışında gerçekleşir.