Float ve Double Arasındaki Fark - Hangisini Kullanmalıyım?

(Not: Bu makalede okuyucuların Bilgisayar Biliminin temelleri hakkında bilgi sahibi oldukları varsayılmaktadır)

Bilgisayar Bilimi'ne kayıtlı birçok yeni başlayan programcı / öğrenci, Bilgisayar Bilimi'nde çalıştıkları alanla ilgili sık sorulan soruları sormaktadır. Başlangıç ​​kurslarının çoğu, modern bilgisayarlarda kullanılan sayı sisteminin konuları ile başlar; ikili, ondalık, sekizli ve onaltılık sistemi. Bunlar, bilgisayarlardaki sayısal değerlerin (veya hesap makinelerinin ve diğer dijital bilgisayarların) dahili temsili olan bilgisayar numarası biçimleridir. Bu değerler “bit gruplaması” olarak saklanır.

Bildiğimiz gibi bilgisayarlar, verileri ikili basamak kümelerinde (yani, 1s ve 0sn, gibi, 1111 Temsil 15 ondalık sistemde), dinamik bir değer aralığını temsil etmek için kullanılan farklı sayı biçimlerini öğretmek mantıklıdır, çünkü herhangi bir işlemde hesaplama / sayı işlemenin temel bloklarını oluştururlar. Sayı sistemi sınıfta tanımlandığında (genellikle kötü), öğrenciler aynı tür içindeki farklı sayı biçimlerine geçmeye eğilimlidir (ör.., kayan noktalı aritmetik) belirli hassasiyet ve sayı aralığına sahip. Böylece, belirli türler arasındaki nüansları öğrenmek zorunda kalırlar. En yaygın kullanılan veri türlerinden ikisi şamandıra ve Çift, ve aynı ihtiyaçları hedeflerken (ör.., kayan noktalı aritmetik), bunların dahili gösterimlerinde ve programdaki hesaplama üzerindeki genel etkilerinde oldukça farklılıklar vardır. Birçok programcının Düz ve Çift veri türleri arasındaki nüansları kaçırması ve ilk etapta kullanılmaması gereken yerlerde onları kötüye kullanması talihsiz bir durumdur. Sonuçta, programın diğer bölümlerinde yanlış hesaplamalara neden olur.

Bu yazıda, C programlama dilinde kod örnekleri ile float ve double arasındaki farkı anlatacağım. Başlayalım!

Float vs Double… Anlaşma nedir?

Float ve Double, kayan noktalı aritmetik işlemler için kullanılan veri temsilidir, matematik sınıfında hesapladığınız ondalık sayıları düşünün, örneğin, 20,123, 16.23, 10.2, vb., tam sayılar değildir (ör.., 2, 5, 15, vb.), bu nedenle ikili dosyadaki kesirlerin dikkate alınmasını gerektirir. Ortaya çıkan ondalık sayılar olarak (ör.., 20,123, 16.23, vb.) normal bir ikili formatla (yani, Tamsayı) kolayca temsil edilemez. Float ve Double arasındaki temel fark, birincisinin tek kesinlikli (32 bit) kayan nokta verisi, ikincisinin ise çift kesinlikli (64 bit) kayan nokta veri tipidir. Double, “double” olarak adlandırılır, çünkü temelde Float'ın çift duyarlıklı bir versiyonudur. Büyük bir miktar hesaplıyorsanız (sayıdaki binlerce 0'ı düşünün), o zaman çiftlerdeki yanlışlıklar daha küçük olur ve çok fazla hassasiyet kaybetmezsiniz.

Kod örneklerini kullanarak ayrıntı vermek daha iyidir. Aşağıda C dilinde sağlanan matematik işlevleri aracılığıyla Float ve Double işlemleri yer almaktadır:

#Dahil etmek

int main ()

kayan sayı 1 = 1.f / 82;

şamandıra num2 = 0;

için (int i = 0; i < 738; ++i)

num2 + = num1;

printf (“%. 7g \ n”, num2);

çift ​​num3 = 1.0 / 82;

çift ​​num4 = 0;

için (int i = 0; i < 738; ++i)

num4 + = num3;

printf (“%. 15g \ n”, num4);

) (GetChar;

Aşağıdakileri yazdırır:

9.000031

8,99999999999983

Burada, Float ve Double'un hassasiyetindeki ufak farkın, Float'tan daha doğru olmasına rağmen, tamamen farklı bir cevap verdiğini görebilirsiniz..

C'deki sqrt () işlevi örneği aşağıdadır:

#Dahil etmek

#Dahil etmek

int main ()

kayan sayı 1 = sqrt (2382719676512365.1230112312312312);

çift ​​num2 = sqrt (2382719676512365.1230112312312312);

printf (“% f \ n”, num1);

printf (“% f \ n”, num2);

) (GetChar;

Aşağıdaki çıktıyı verir:

48813108.000000

48813109.678778

Burada, Double'teki cevabın daha iyi bir hassasiyete sahip olduğunu görebilirsiniz..

Sonuçta, C'de birkaç standart matematik işlevi Double üzerinde çalıştığından ve modern bilgisayarlar Double kayan nokta hesaplamaları için son derece hızlı ve verimli olduğundan, kayan nokta aritmetiği için Double kullanmak daha iyidir. Bu, çok fazla kayan nokta sayısında (sayılarda binlerce 0'lık büyük diziler düşünün) veya iki kat desteklemeyen bir sistemde çalışmıyorsanız, Float kullanma ihtiyacını azaltmaya neden olur. Hassas GPU'lar, düşük güçlü cihazlar ve belirli platformlar (ARM Cortex-M2, Cortex-M4, vb.) henüz Double'i desteklemediğinden, Float'ı kullanmalısınız. Ek olarak, hatırlanması gereken bir şey, belirli GPU'ların / CPU'ların Şamandıra işleminde, vektörlerin / matrisin hesaplanmasında olduğu gibi daha iyi / verimli çalıştığıdır, bu nedenle hangisini kullanmanız gerektiğine daha iyi karar vermek için donanım özellikleri el kitabına / belgelerine bakmanız gerekebilir. belirli bir makine için.

Modern bilgisayarları hedefleyen kodda Float kullanmak için nadiren bir neden yoktur. Double'teki ekstra hassasiyet, programın diğer bölümlerinde sorunlara neden olabilecek hataların yuvarlanması veya diğer kesinsizlik olasılığını azaltır, ancak ortadan kaldırmaz. Birçok matematik işlevi veya işleçleri Çift dönüştürür ve döndürür, bu nedenle sayıları Float'a geri döndürmenize gerek yoktur, çünkü bu kesinliği kaybedebilir. Kayan nokta aritmetiği hakkında ayrıntılı bir analiz için, bu harika makaleyi okumanızı şiddetle tavsiye ederim (http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html).

özet

Yani… kısaca:

Float kullanmanız gereken yerler:

  • Tek hassasiyetin çift hassasiyetten daha hızlı olduğu bir donanımı hedefliyorsanız.
  • Uygulamanız kayan noktalı aritmetiği, binlerce 0 ile binlerce sayı gibi yoğun bir şekilde kullanır.
  • Çok düşük seviyeli optimizasyon yapıyorsunuz. Örneğin, aynı anda birden çok sayı / dizi / vektör üzerinde çalışan özel CPU talimatları (yani SSE, SSE2, AVX vb.) Kullanıyorsunuz..

Sonuç

Bu makalede, Float ve Double arasındaki farkı vurguladım ve hangisinin belirli yerlerde kullanılması gerektiğini vurguladım. Muhtemelen, özellikle modern bilgisayarları hedefliyorsanız, Double kayan noktalı aritmetik kullanımı nedeniyle düşük verimlilik şansı düşük olduğundan, çoğu yerde körü körüne kör olarak kullanmak daha iyidir. Herhangi bir sorunuz varsa, aşağıdaki yorum bölümünde sorabilirsiniz!