Float ile Double arasındaki fark - Hangisini Kullanmalıyım?

Anonim

(Not: Bu makale

Bilgisayar Bilimlerine giren birçok yeni başlayanlar / öğrenciler, okudukları Bilgisayar Bilimleri içindeki belirli alanla ilgili sıkça sorulan soruları sormaktadırlar. Çoğu yeni kurslar, ikili , ondalık , sekizlik ve onaltılık < sistemi. Bunlar, bilgisayarların (veya hesaplayıcıların ve diğer herhangi bir dijital bilgisayarın) içindeki sayısal değerlerin dahili gösterimleridir bilgisayar numarası formatlarıdır. Bu değerler "bit gruplaması" olarak saklanır.

Biliyoruz ki, bilgisayarlar ikili basamaklı kümeler halinde (yani,

1s ve 0s kombinasyonlarında, örneğin 1111 ondalık sistemde 15 temsil eder), hesaplama / sayı işlemenin temel bloklarını oluşturduğu için dinamik bir değer aralığını temsil etmek için kullanılan farklı sayı formatlarını öğretmek mantıklı olur her türlü operasyonda. Sayı sisteminde sınıfta (genellikle zayıf olarak) tanımlandıktan sonra, öğrenciler belirli hassasiyet ve sayı aralığına sahip olan aynı türdeki (yani kayan nokta aritmetiği ) farklı sayı formatlarına geçmeye teşvik edilirler. Böylece belirli tipler arasındaki nüansları öğrenmek zorunda kalıyorlar. En sık kullanılan veri türlerinden ikisi Float ve Double 'dır ve aynı ihtiyaçları (yani kayan nokta aritmetiği ) hedeflerken iç temsilindeki bazı farklar ve programdaki hesaplama üzerindeki genel etkisi. Birçok programcının Düz ve Çoğa veri türleri arasındaki nüansları kaçırması talihsizdir ve ilk etapta kullanılmamaları gereken yerlerde yanlış kullanımı sonucunu doğurur. Sonuçta, programın diğer bölümlerinde yanlış hesaplamalara neden olur.

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

Float vs Double … Anlaşma ne?

Float ve Double, kayan nokta aritmetik işlemler için kullanılan veri temsilidir, matematik sınıfında hesapladığınız ondalık sayıları düşünürler, örneğin

20. 123 , 16. 23 , 10. 2 , vb. Ise, tam sayı değildir (yani, 2 , 5 , 15 vb.), Dolayısıyla ikili bölümler. Ortaya çıkan ondalık sayıları (yani, 20.123 , 16.23 vb.)), normal bir ikili biçimde (yani, Tamsayı) kolayca temsil edilemez. Float ve Double arasındaki temel fark, birincisinin tek hassas (32 bit) kayan nokta verileriyken ikincisinin çift hassasiyetli (64 bit) kayan nokta veri türü olmasıdır. Double, "double" olarak adlandırılır çünkü temelde Float'ın çift hassas bir versiyonudur. Büyük bir miktarı hesaplarken (sayıdaki binlerce 0'ı düşünün), Double'deki hatalar daha küçük olur ve çok fazla kesinlik kazanmazsınız. 3'ten büyük ->

Kod örneklerini kullanarak ayrıntı vermek daha iyidir. Float ve Double üzerinde C dili tarafından sağlanan matematik işlevleri ile ilgili işlem şunlardır:

#include

int main () {

float num1 = 1. f / 82;

float 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ğıdakilere yazdırır:

9. 000.031

8. 99999999999983

Burada Float ve Double hassasiyetindeki ufak farkın tamamen farklı bir cevap verdiğini görebilirsiniz, ancak Double, Float'tan daha doğru gibi görünüyor.

Aşağıdaki C'de sqrt () işlevinin örneğidir:

#include

#include

int main () {

float num1 = 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'deki cevabın daha iyi bir hassaslığa sahip olduğunu görebilirsiniz.

Sonuç olarak, C'deki birkaç standart matematik işlevi Çifte ve modern bilgisayarlar Çifte kayan nokta hesaplamaları için son derece hızlı ve verimli olduğu için, Kayan nokta aritmetiği için Çift'i kullanmak daha iyidir. Bu, çok sayıda kayan noktalı sayı üzerinde çalışmanıza gerek duymadığınız (sayılarda binlerce 0'ın bulunduğu büyük dizileri düşününceye kadar) Float'ı kullanma ihtiyacınızı azaltmanıza yol açar veya çift nokta işaretli sayıları desteklemeyen bir sistem üzerinde çalışıyorsanız, birçok GPU'lar, düşük güçlü cihazlar ve belirli platformlar (ARM Cortex-M2, Cortex-M4, vb.) Double'ı henüz desteklemediğinden, Float'ı kullanmanız gerekir. Hatta unutulması gereken bir nokta da, bazı GPU'ların / CPU'ların, vektörlerin / matris hesaplamasında olduğu gibi, Float işlemede daha iyi / verimli çalışmasıdır; bu nedenle hangisini kullanmanız gerektiğine daha iyi karar vermek için donanım belirtim kılavuzuna / belgelerine bakmanız gerekebilir Belli bir makine için.

Modern bilgisayarları hedefleyen kodda Double yerine Float kullanmak için nadiren bir neden yoktur. Double'deki ekstra duyarlık, yuvarlama hatalarını veya programın diğer bölümlerinde sorunlara neden olabilecek diğer hataları azaltma, ancak ortadan kaldırmaz. Birçok matematik işlevi veya operatörü Çift'i dönüştürür ve geri gönderir; dolayısıyla, sayıları Float'a geri atmanız gerekmez; bu, hassaslığı kaybedebilir.Kayan nokta aritmetiği hakkında detaylı bir analiz için bu harika makaleyi okumanızı öneririm (// docs. Oracle. Com / cd / E19957-01 / 806-3568 / ncg_goldberg. Html).

Özet

Yani … kısaca:

Float kullanmanız gereken yerler:

Tek hassasiyetli çift duyarlıktan daha hızlı bir donanım hedefliyorsanız.

  • Uygulamanız binlerce 0'ın bulunduğu binlerce sayı gibi kayan nokta aritmetiği kullanmaktadır.
  • Çok düşük seviye optimizasyon yapıyorsunuz. Örneğin, bir seferde çok sayıda dizi / vektör üzerinde çalışan özel CPU talimatlarını (ör. SSE, SSE2, AVX vb.) Kullanıyorsunuzdur.
Sonuç

Bu yazıda Float ve Double arasındaki farkı vurguladım ve hangisinin belirli yerlerde kullanılması gerektiğini vurguladım. Açıkçası, Çoğu yerde körü körüne Double kullanmak daha iyidir, özellikle modern bilgisayarları hedeflerseniz, Double-floating-point aritmetik kullanımı nedeniyle düşük verimlilik şansının düşük olması olasılığı yüksektir. Herhangi bir sorunuz varsa, aşağıdaki yorum bölümünde sorabilirsiniz!