logo

Python'da kayan nokta aralığı

Python'da, şamandıra aralığı değerler uygulamaya ve platforma bağlıdır. Python dili spesifikasyonu yalnızca şunu gerektirir kayan nokta sayılar en azından destekliyor 1e-308 ile 1e+308 en azından bir hassasiyetle 53 bit .

Uygulamada çoğu modern Python uygulaması aşağıdakileri kullanır: IEEE754 yaklaşık olarak bir aralık sağlayan kayan nokta standardı 1.7e-308 ile 1.7e+308 kesinlik ile 53 bit . Bu aralık tüm platformlarda aynıdır ve yerleşik kayan tür tarafından desteklenir.

Bununla birlikte, kayan nokta aritmetiğinin, özellikle çok büyük veya çok küçük sayılar üzerinde işlemler gerçekleştirilirken, yuvarlama hatalarına ve diğer belirsizlik kaynaklarına maruz kalabileceğini unutmamak önemlidir. Bazı durumlarda beklenmeyen davranışlara ve hatalara yol açabilir.

Bu sorunlardan kaçınmak için sıklıkla kullanılması önerilir. ondalık veya sabit nokta Parasal değerlerle veya yüksek hassasiyet gerektiren diğer uygulamalarla çalışırken aritmetik. ondalık modül Python'da yapılandırılabilir hassasiyetle sabit nokta aritmetiği desteği sağlar ve bu uygulamalar için kayan nokta aritmetiğine iyi bir alternatiftir.

birleştirme java dizesi

IEEE754 standart, Python da dahil olmak üzere çoğu modern programlama dili tarafından kullanılan kayan noktalı sayıların aralığını ve hassasiyetini tanımlar. Standart, kayan noktalı sayılar için iki temel formatı tanımlar:

    Tek duyarlıklı format

Kullanır 32 bit ve yaklaşık olarak sağlar 7 ondalık sayı hassas rakamlar.

    Çift duyarlıklı format

Kullanır 64 bit ve yaklaşık olarak sağlar 16 ondalık sayı hassas rakamlar.

Python'un kullanım alanları çift ​​duyarlıklı varsayılan olarak kayan noktalı sayılar; bu, kayan nokta değerlerinin aralığının yaklaşık olarak olduğu anlamına gelir 1.7e-308 ile 1.7e+308 kesinlik ile 53 bit . Bu aralık, kullanılarak temsil edilebilecek maksimum ve minimum üslerle belirlenir. 11 bit kullanılarak temsil edilebilecek maksimum ve minimum değerlerle (yani sayının kesirli kısmı) birleştirilir. 52 bit .

Kayan nokta aritmetiğinin gerçek kesinliği, sayıların bellekte saklanma şekli, işlem sırası ve yuvarlama modunun seçimi gibi birçok faktörden etkilenebilir. Bazı durumlarda ince yuvarlama hatalarına ve diğer belirsizlik kaynaklarına yol açabilir.

Bu sorunlardan kaçınmak için çok büyük veya çok küçük sayılarla çalışırken veya yüksek hassasiyet gerektiğinde alternatif yaklaşımların kullanılması sıklıkla tavsiye edilir. Örneğin:

  1. Kullanmak sabit nokta aritmetiği veya ondalık aritmetik , sabit sayıda ondalık basamak hassasiyeti sağlar ve yuvarlama hatalarını önler.
  2. Kullanmak keyfi hassasiyet gibi kütüphaneler 'mpmate' veya 'gmpy2' Bu, hesaplamaları çok yüksek hassasiyetle yapmanıza ve yuvarlama hatalarını önlemenize olanak tanır.

Dikkat edilmesi gereken önemli bir husus, Python'da kayan noktalı sayılar üzerinde aritmetik işlemler gerçekleştirirken, kayan noktalı aritmetiğin çalışma şekli nedeniyle bazı beklenmedik davranışlarla karşılaşabileceğinizdir.

Bazı aritmetik işlemler, kayan nokta aritmetiği kullanılarak tam olarak temsil edilemeyen çok küçük veya çok büyük sayılarla sonuçlanabilir. Bu durumlarda sonuç şu olabilir. yuvarlak veya kesik hesaplamalarınızda beklenmeyen davranışlara veya yanlışlıklara yol açabilir.

Kayan nokta aritmetiği değil çağrışımsal yani işlemleri gerçekleştirme sıranız sonucu etkileyebilir. Örneğin, (a + b) + c eşit olmayabilir bir + (b + c) yuvarlama hataları ve diğer belirsizlik kaynakları nedeniyle.

Kayan nokta aritmetiği de değildir dağıtıcı , bu şu anlama geliyor (a + b) * c eşit olmayabilir a * c + b * c yuvarlama hataları ve diğer belirsizlik kaynakları nedeniyle. Bu sorunların etkisini en aza indirmek için, genellikle kayan noktalı sayılarda aritmetik işlemleri daha kesin ve güvenilir bir şekilde gerçekleştirmeye yönelik işlevler sağlayan matematik modülünün veya diğer sayısal kitaplıkların kullanılması önerilir. Eşitlik amacıyla kayan nokta sayılarını karşılaştırmaktan kaçınmak ve bunun yerine iki değer arasındaki farkın büyüklüğünü karşılaştırmak için bir tolerans eşiği veya başka yöntemler kullanmak da iyi bir uygulamadır.

Örnek:

Nasıl olduğunu göstermek için bir örnek verelim kayan nokta aritmetiği python'da beklenmeyen davranışlara yol açabilir:

 a = 0.1 b = 0.2 c = 0.3 result1 = (a + b) + c result2 = a + (b + c) print(result1) print(result2) 

Çıktı:

 0.6000000000000001 0.6 

Açıklama:

Bu örnekte aynı değerleri kullanarak iki farklı hesaplama yapıyoruz. a, b, Ve C . İlk hesaplamada şunu ekleriz: A Ve B önce, sonra sonucu şuna ekleyin: C . İkinci hesaplamada şunu ekleriz: B Ve C önce, sonra sonucu şuna ekleyin: A .

Aynı değerleri kullandıkları için iki hesaplamanın da aynı sonucu vermesini bekleyebiliriz. a, b , Ve C . Ancak kayan nokta aritmetiğinin sınırlamaları nedeniyle iki hesaplama biraz farklı sonuçlar üretir.

İlk hesaplama şu sonucu verir: 0.600000000000000001 ikinci hesaplama şu sonucu üretirken 0,6 . Bunun nedeni, yuvarlama hataları ve diğer belirsizlik kaynakları nedeniyle, ilk hesaplamanın ara sonuçlarının ikinci hesaplamanın ara sonuçlarından biraz farklı olmasıdır.

Bu sorunlardan kaçınmak için sıklıkla kullanılması önerilir. ondalık modül veya gerçekleştirmeye yönelik diğer yöntemler Aritmetik işlemler Açık kayan nokta sayıları daha kesin ve güvenilir bir şekilde

Örneğin:

 import decimal a = decimal.Decimal('0.1') b = decimal.Decimal('0.2') c = decimal.Decimal('0.3') result1 = (a + b) + c result2 = a + (b + c) print(result1) print(result2) 

Çıktı:

 0.6 0.6 

Açıklama:

Bu örnekte, şunu kullanıyoruz: ondalık modül kullanarak aynı hesaplamaları gerçekleştirmek için sabit nokta kesinliğinde aritmetik 1 ondalık basamak. Bu, yuvarlama hatalarından ve diğer belirsizlik kaynaklarından kaçınmamızı sağlar. kayan nokta aritmetik. Sonuç olarak her iki hesaplama da aynı sonucu verir. 0,6 .