Sabit nokta ve Kayan nokta sayısı


109

Google'ın her yerinde onlar hakkında okunması zor olan sabit nokta ve kayan nokta sayılarını anlayamıyorum. Ancak okuduğum hiçbiri, gerçekte ne olduklarına dair yeterince basit bir açıklama sağlamıyor. Örnekle sade bir tanım alabilir miyim?


İyi bir tanım bulmakta da sorun yaşıyorum. Aradığım en önemli şey şu sonuçları anlamama yardımcı olacak bir şey: 3.11 + 42.0 = 45.110001 (45.11 değil), 3.12 + 42.0 = 45.119999 (45.12 değil), 3.15 + 42.0 = 45.150002 (45.15 değil).
Bart S.

1
Bunun konuyla ilgili bir tartışma olduğunu düşünüyorum (özellikle kayan sayılarla tuzakları ve sabit noktalı daha iyi hassasiyeti ve neden parayı asla bir kayan nokta olarak tanımlamak istemeyeceğinizi açıklamak. Stackoverflow.com/questions/6320209/…
Andrew Norman

Konuların belirtildiği rastgele bağlantı "OpenGL® ES OpenGL ES, kayan nokta ve sabit nokta sistemleri için profilleri ve EGL ™ spesifikasyonunu içerir ..."
The Red Pea

Yanıtlar:


145

Sabit nokta numarası, tamsayı bölümü (ondalık noktanın solundaki bölüm) için ayrılmış belirli sayıda bit (veya basamak) ve kesirli bölüm (ondalık basamağın sağındaki bölüm) için ayrılmış belirli sayıda bit içerir. nokta). Numaranız ne kadar büyük veya küçük olursa olsun, her bölüm için her zaman aynı sayıda bit kullanacaktır. Örneğin, sabit nokta biçiminiz ondalık IIIII.FFFFFsayıdaysa, temsil edebileceğiniz en büyük sayı olur 99999.99999ve sıfır olmayan en küçük sayı olur 00000.00001. Bu tür sayıları işleyen her kod biti, ondalık noktanın nerede olduğuna dair yerleşik bilgiye sahip olmalıdır.

Bir kayan noktalı sayı, tamsayı bölümü veya kesirli bölüm için belirli sayıda bit ayırmaz. Bunun yerine, sayı için belirli sayıda biti ( mantis veya anlamlı olarak adlandırılır ) ve bu sayının içinde ondalık basamağın nerede olduğunu ( üs olarak adlandırılır ) söylemek için belirli sayıda biti ayırır . Dolayısıyla, üs için ayrılmış 2 basamaklı 10 basamaklı bir kayan nokta numarası, en büyük değerini 9.9999999e+50ve en küçük sıfır olmayan değerini temsil edebilir 0.0000001e-49.


8
Kayan noktalı sayıların neredeyse her zaman işaretli olduğunu unutuyorsunuz, bu nedenle minimum değer gerçekten öyle olacaktır -9.9999999e+50.
Brian Gordon

4
Ayrıca, 0 ile 1 arasında 1.000.000 ile 1.000.001 arasında yapabileceğinizden çok daha ayrık değerleri temsil edebilmeniz için üslü ağırlık verme vardır. Ve kayan nokta işlemleriyle ilgili pek çok karmaşıklık vardır, örneğin iki çok benzer sayı arasındaki fark olarak 0'ı rapor etmemenizi sağlamak gibi, sapma hassasiyeti artırmak için yeterli değildir.
Brian Gordon

28
@BrianGordon: İşaret bitlerini unutmadım; Basit bir açıklamaya sahip olmak ve minimum / maksimum ve en küçük / en büyük arasındaki fark hakkında endişelenmemek için onları kasıtlı olarak görmezden geldim . Ayrıca, (herhangi iki sayı arasındaki ayrık değerlerin sayısıyla hiçbir ilgisi olmayan) üssel önyargıyı, NaN'ler, sonsuzluklar, normalleştirme, kademeli alt akış, işaretli sıfırlar, çoğu kayan değerin ikili olduğu gerçeğini (ilk bit mantisin dışında bırakılmalıdır) ve kavramı açıklamak için gereksiz olan diğer bazı yönler.
Gabe

2
Minimum sabit nokta sayısı için sınır neden 00000.00001? Onun 00000.00000yerine görmeyi bekliyorum . Ayrıca, sabit nokta sayıları hakkında daha ayrıntılı bilgi veren referanslarınız var mı?
Nicholas Miller

4
@NickMiller: Karışıklık için üzgünüm ama sıfır olmayan sayılardan bahsediyordum. Örnek formatım 0, 0.00001, 0.00002, ..., 99999.99998, 99999.99999'u temsil edebilir.
Gabe

31

Sabit nokta sayısı, ondalık noktadan sonra sabit sayıda basamak olduğu anlamına gelir. Kayan nokta sayısı, ondalık noktadan sonra değişen sayıda basamağa izin verir.

Örneğin, ondalık noktadan sonra tam olarak dört basamak gerektiren sayıları saklamanın bir yolu varsa, bu sabit noktadır. Bu kısıtlama olmadan kayan noktadır.

Çoğunlukla, sabit nokta kullanıldığında, programcı aslında bir tamsayı kullanır ve ardından bazı basamakların ondalık ayırıcının ötesinde olduğunu varsayar. Örneğin, iki basamaklı kesinlik tutmak isteyebilirim, bu nedenle 100 değeri aslında 1.00 anlamına gelir, 101 1.01 anlamına gelir, 12345 123.45 anlamına gelir, vb.

Kayan nokta sayıları daha genel amaçlıdır çünkü aynı şekilde çok küçük veya çok büyük sayıları temsil edebilirler, ancak ondalık basamağın gittiği yer için fazladan depolamaya sahip olmanın küçük bir cezası vardır.


2
kayan nokta kullanımı, onlarla hesaplamalar yapmaya başladığınızda, örneğin gerçekten küçük ve gerçekten büyük bir kayan nokta sayısını birlikte eklerseniz bir problem haline gelir. Toplanan sonuç, iki uçlu bir sayıyı temsil etmesi gerektiğinden ve daha düşük ondalık sayılar kırpıldığından (ve yuvarlanmadığından) doğruluğu kaybeder.
Andrew Norman

2
ayrıca bir kayan noktada üs değerlerinin potansiyel kullanımı, standart sayılar bekleyen bilgisayar sistemlerinde sorunlara neden olabilir
Andrew Norman,

5

Anladığım kadarıyla, sabit nokta aritmetiği tamsayılar kullanılarak yapılır. ondalık kısım sabit bir bit miktarında saklanır veya sayı, ondalık kesinliğin kaç basamaklı olması gerektiği ile çarpılır.

Örneğin, sayının 12.34saklanması gerekiyorsa ve ondalık noktadan sonra sadece iki basamaklı kesinliğe ihtiyacımız varsa, sayı 100elde etmek için ile çarpılır 1234. Bu sayı üzerinde matematik işlemi yaparken, bu kural kümesini kullanırdık. Bu sayıya 5620veya eklenmesi verilerde veya .56.20685468.54

Sabit noktalı bir sayının ondalık kısmını hesaplamak istiyorsak, modulo (%) operandını kullanırız.

12.34 (sözde kod):

v1 = 1234 / 100 // get the whole number
v2 = 1234 % 100 // get the decimal number (100ths of a whole).
print v1 + "." + v2 // "12.34"

Kayan nokta sayıları, programlamada tamamen farklı bir durumdur. Kayan noktalı sayılar için mevcut standart, sayının verileri için 23 bit, üs için 8 bit ve işaret için 1 gibi bir şey kullanır. Bununla ilgili daha fazla bilgi için bu Wikipedia bağlantısına bakın.


3

'Sabit nokta' terimi, sayıların ondalık noktadan sonra ve bazen ondalık noktadan önce sabit sayıda rakamla temsil edildiği karşılık gelen tarzı ifade eder. Kayan nokta gösterimi ile, ondalık noktanın yerleşimi, sayının önemli basamaklarına göre 'kayabilir'. Örneğin, tekdüze ondalık nokta yerleştirme kuralına sahip bir sabit nokta gösterimi, 123.45, 1234.56, 12345.67, vb. Sayıları temsil edebilirken, bir kayan nokta gösterimi ek olarak 1.234567, 123456.7, 0.00001234567, 1234567000000000, vb. Temsil edebilir.


-6

123.456789 numarasını al

  • Bir tam sayı olarak bu sayı 123 olacaktır.
  • Sabit bir nokta (2) olarak, bu sayı 123,46 olacaktır (Yukarı yuvarladığınızı varsayarsak)
  • Kayan nokta olarak bu sayı 123.456789 olacaktır.

Kayan nokta, her sayının çoğunu büyük bir hassasiyetle göstermenizi sağlar. Sabit daha az hassastır, ancak bilgisayar için daha basittir.


11
Bir sayıyı yazabileceğiniz kesinlik, kayan nokta, tamsayı veya sabit nokta ile yazılmasıyla ilgili değildir. Elinizdeki önemli basamak sayısıyla ilgilidir. Örneğin, INT_MAX, tam olarak bir int olarak temsil edilebilen, ancak onu tam olarak temsil etmek için gereken 31 bitlik hassasiyete sahip olmadıkları için bir float olarak gösterilemeyen bir sayıdır.
Kian

1
sabit, söz konusu numarayı işleyecek boyutta olduğu sürece en kesin olanıdır. Sabit nokta sayılarıyla matematik yaptığınızda, bir hesaplamanın kalanı ondalık sınırı aştığında yuvarlama gerçekleşir. Bir kayan nokta ile çok büyük bir sayı ile çok küçük bir sayı eklerseniz çok yanlış bir değer elde edebilirsiniz. Bu gerçekleştiğinde rakamlar yuvarlanmadan kaybolur
Andrew Norman

Bu yanıltıcı ve yanlıştır. Sabit nokta, ondalık noktadan sonraki basamak sayısının sabit olduğu anlamına gelir. Ne kadar hassas olduğu hakkında hiçbir şey söylemiyor.
Oscar Smith
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.