Kayan nokta sayılarının eşitlik için karşılaştırılamayacağı konusundaki ortak akıl yanlıştır. Kayan noktalı sayılar tamsayılardan farklı değildir: Eğer "a == b" değerini değerlendirirseniz, aynı sayılar ve yanlışsa, doğru olur (iki NaN'nin elbette aynı sayılar olmadığı anlaşılır).
Asıl sorun şudur: Bazı hesaplamalar yaptım ve karşılaştırmam gereken iki sayının tam olarak doğru olduğundan emin değilseniz, o zaman ne? Bu sorun kayan nokta için tamsayılarla aynıdır. "7/3 * 3" tamsayı ifadesini değerlendirirseniz, "7 * 3/3" ile eşit karşılaştırılmaz.
Diyelim ki "Tamsayı eşitlik için nasıl karşılaştırırım?" böyle bir durumda. Tek bir cevap yok; ne yapmanız gerektiği belirli duruma, özellikle ne tür hatalara ve ne elde etmek istediğinize bağlıdır.
İşte bazı olası seçenekler.
Eğer matematiksel olarak kesin sayılar eşit olursa "doğru" bir sonuç elde etmek istiyorsanız, iki sayıda aynı hataları aldığınızı kanıtlamak için yaptığınız hesaplamaların özelliklerini kullanmaya çalışabilirsiniz. Bu uygulanabilirse ve tam olarak hesaplanırsa eşit sayılar verecek ifadelerden kaynaklanan iki sayıyı karşılaştırırsanız, karşılaştırmadan "true" alırsınız. Başka bir yaklaşım, hesaplamaların özelliklerini analiz edebilmeniz ve hatanın hiçbir zaman belirli bir miktarı, belki de mutlak bir miktarı veya girdilerden birine veya çıktılardan birine göre bir miktarı aşmadığını kanıtlayabilmenizdir. Bu durumda, hesaplanan iki sayının en fazla bu miktarda farklılık gösterip göstermediğini sorabilir ve aralık dahilindeyse "true" değerini döndürebilirsiniz. Bağlı bir hatayı kanıtlayamıyorsanız, tahmin edebilir ve en iyisini umabilirsiniz. Tahmin etmenin bir yolu, birçok rastgele örneği değerlendirmek ve sonuçlarda ne tür bir dağılım elde ettiğinizi görmektir.
Tabii ki, sadece matematiksel olarak kesin sonuçlar eşitse "true" alma gereksinimini ayarladığımız için, eşit olmasa bile "true" alma olasılığını açık bıraktık. (Aslında, her zaman "doğru" döndürerek gereksinimi karşılayabiliriz. Bu hesaplamayı basitleştirir, ancak genellikle istenmeyen bir durumdur, bu yüzden aşağıdaki durumu iyileştirmeyi tartışacağım.)
Eğer matematiksel olarak kesin sayılar eşit değilse "yanlış" bir sonuç elde etmek istiyorsanız, matematiksel olarak tam sayılar eşit değilse sayıları değerlendirmenizin farklı sayılar verdiğini kanıtlamanız gerekir. Bu, birçok yaygın durumda pratik amaçlar için imkansız olabilir. Öyleyse bir alternatif düşünelim.
Matematiksel olarak kesin sayılar belirli bir miktardan daha fazla farklılık gösteriyorsa, yararlı bir gereklilik "yanlış" sonuç almamız olabilir. Örneğin, belki de bir bilgisayar oyununda atılan topun nereye gittiğini hesaplayacağız ve yarasa vurup vurmadığını bilmek istiyoruz. Bu durumda, top sopayı vurursa kesinlikle "doğru" almak istiyoruz ve top sopayı çok uzaktaysa "yanlış" almak istiyoruz ve eğer top matematiksel olarak kesin bir simülasyon yarasayı kaçırdı, ancak yarasa vurmanın milimetresi içinde. Bu durumda, topun pozisyonu ve yarasa pozisyonu hesaplamamızda en fazla bir milimetre (ilgili tüm pozisyonlar için) birleşik hata olduğunu kanıtlamamız (veya tahmin / tahmin etmemiz) gerekir. Bu bize her zaman geri dönmemizi sağlar "
Bu nedenle, kayan nokta sayılarını karşılaştırırken neye geri döneceğinize nasıl karar vereceğiniz çok özel durumunuza bağlıdır.
Hesaplamalar için hata sınırlarını nasıl kanıtlayacağınız konusunda, bu karmaşık bir konu olabilir. En yakın yuvarlak modda IEEE 754 standardını kullanan herhangi bir kayan nokta uygulaması, herhangi bir temel işlem için kesin sonuca en yakın kayan nokta sayısını döndürür (özellikle çarpma, bölme, toplama, çıkarma, kare kök). (Beraberlik durumunda, düşük bitin eşit olması için yuvarlak yapın.) (Karekök ve bölünme konusunda özellikle dikkatli olun; dil uygulamanız IEEE 754'e uygun olmayan yöntemler kullanabilir.) Bu gereksinim nedeniyle, tek bir sonuçtaki hata, en az anlamlı bit değerinin en fazla 1 / 2'sidir. (Daha fazla olsaydı, yuvarlama değerin 1 / 2'si dahilinde farklı bir sayıya giderdi.)
Oradan devam etmek oldukça karmaşıklaşıyor; bir sonraki adım, girişlerden birinin zaten bir hata yaptığı bir işlem gerçekleştirmektir. Basit ifadeler için, bu hatalar son hatada bir sınıra ulaşmak için hesaplamalar yoluyla takip edilebilir. Uygulamada, bu yalnızca yüksek kaliteli bir matematik kütüphanesinde çalışmak gibi birkaç durumda yapılır. Ve elbette, tam olarak hangi işlemlerin gerçekleştirileceği üzerinde kesin kontrole ihtiyacınız var. Üst düzey diller genellikle derleyiciye bol bol gevşeklik sağlar, bu nedenle hangi sipariş işlemlerinin gerçekleştirildiğini bilmiyor olabilirsiniz.
Bu konu hakkında yazılabilecek (ve yazılabilecek) çok daha fazlası var, ama orada durmam gerekiyor. Özet olarak, cevap: Bu karşılaştırma için kütüphane rutini yoktur, çünkü bir kütüphane rutininin içine koymaya değer en ihtiyaçlara uyan tek bir çözüm yoktur. (Göreceli veya mutlak bir hata aralığıyla karşılaştırmak sizin için yeterliyse, bunu bir kütüphane rutini olmadan yapabilirsiniz.)