Taban 10'da gösterilemeyen ancak taban 2'de gösterilebilen numaralar var mı?


42

C#yer alır decimaltürü Örneğin taban 10 içinde tam bir gösterimi ihtiyacı sayılar için kullanılan, 0.1bir baz 2'de temsil edilemez (örn floatve double) ve her zaman bu tip değişkenlerin saklanan bir yaklaşım olur.

Tersine çevrilen gerçeğin de mümkün olup olmadığını merak ediyordum. Taban 10'da gösterilemeyen ancak taban 2'de gösterilebilen sayılar var mı (bu durumda bunları işlemek için floatyerine bir kullanmak isterdim decimal)?


14
Soruya +1, ancak c # etiketi burada gerçekten uygulanabilir mi? Diğer diller de ondalık tiptedir.
Patrick M,

1
@Max: Bir alıştırma olarak, bir taban 2 numarasını taban 10'a elle dönüştürmeyi düşünmenizi öneririm. Örneğin, değerini hesaplamak için 0.11_b2yazın 0.5 + 0.5 * 0.5. Başarısız olabilecek veya tekrarlayan bir ondalık basıma neden olabilecek bir adım var mı? Şahsen, bu alıştırmanın, temel 2 sayılarıyla ilgili bir sezgiyi aşarak harika bir iş çıkardığını düşünüyorum. Sanırım bir adım daha ileri gidebilir ve bu alıştırmayı yapım aşamasında bir kanıt haline getirebilir.
Brian

Ah, ama yanılıyorsun. 1/1010
Xavier J

3
@Ramhound Bellek sınırlamaları göz önüne alındığında, ikili 0.0999999....998..tam sayıyı temsil edebilir , ancak tam sayıyı temsil edemez 0.1- en yakın hundreth'e yuvarlama gibi yaklaşımlar 0.100size tüm rakamları göstermemeyi ve bunun yerine yuvarlamayı içeren bir uygulama sorunudur .
Izkata

1
Eh, '0.1' tam olarak temsil edilmesini sağlayan bir FP kodlama mekanizması ile gelip mümkündür. Böyle bir kodlama, sadece temsil edilebilecek ve gösterilemeyen FP sayı aralıkları kümeleri etrafında kayar.
Martin James

Yanıtlar:


104

İşte ikilem anahtarıdır: 10ürünüdür 2ve 5. Sen k * 1/2 olduğunu tam olarak tabanın 10 ondalık sayılar herhangi sayısını temsil edebilir n * 1/5 m nerede k, nve mtam sayılardır.

Alternatif olarak ifade edilir - n1 / n'deki sayı bazın faktörlerinin bir parçası olmayan bir faktör içeriyorsa, sayı tam olarak ikili / ondalık / o sayıdaki genişlemedeki sabit sayıdaki hanelerde gösterilemez. sayı - yinelenen bir kısmı olacak. Örneğin 1/15 = 0.0666666666 .... çünkü 3 (15 = 3 x 5) 10 faktörü değildir.

Böylece, tam olarak baz 2'de (k * 1/2 n ) temsil edilebilen herhangi bir şey tam olarak 10 bazında temsil edilebilir.

Bunun ötesinde, sayıyı göstermek için kaç basamak / bit kullandığınızın bir sorunu var. Bazı bazlarda tam olarak temsil edilebilecek bazı sayılar vardır, ancak yapılması gereken bazı basamak / bitlerden daha fazlasını gerektirir.


İkili dosyada, ondalık sayıda uygun şekilde 0,1 olan 1/10 sayısı, ikili olarak sabit sayıda bit ile temsil edilebilecek bir sayı olarak gösterilemez. Bunun yerine, sayı 0.00011001100110011 ... 2'dir (0011 kısmı sonsuza dek tekrarlanır).

1 numara bakmak Lets 2 /1010 2 biraz daha yakından.

          ____                  
       0,00011                  
     + ---------                 
1010 | 1,00000                  
       0                        
       -                       
       1 0                      
         0                      
       ----                     
       1 00 --------- +          
          0 |          
       ----- |          
       1 000 |          
           0 |          
       ------ | tekrarlanan
       10000 | blok    
         1010 |          
       ------ |          
          1100 |          
          1010 |          
          ---- |          
            100 ---- +          

Bu, 1/3 için uzun bölümü yapmaya çalıştığınızda elde ettiğinizle aynı şeydir.

Faktör 1 / (2 1 * 5 1 ) olduğunda 1/10 . Baz 10 için (veya 10'dan herhangi biri), bu sayı sona erer ve normal bir sayı olarak bilinir . Tekrarlayan bir ondalık genişleme, tekrarlayan bir ondalık olarak bilinir ve yinelenmeden sonsuza kadar devam eden sayılar irrasyonel sayılardır.

Bunun arkasındaki matematik Fermat'ın küçük teoremine giriyor ... ve Fermat veya teorem demeye başladığınızda, bir Math.SE sorusu haline geliyor .

Taban 10'da gösterilemeyen ancak taban 2'de gösterilebilen numaralar var mı?

Cevap hayır'.

Bu nedenle, bu noktada rasyonel bir sayının her bir sabit uzunluklu ikili genişlemesinin sabit bir uzunluk ondalık genişlemesi olarak gösterilebileceği net olmalı.


Lets C # ondalık daha yakından göz götürür .NET içinde ondalık kayan nokta ve yazar verilen, nasıl çalıştığını o Thats kabul edeceğiz.

Ondalık tür diğer kayan nokta sayılarıyla aynı bileşenlere sahiptir: bir mantis, bir üs ve bir işaret. Her zamanki gibi, işaret sadece bir bit, ama 96 bit mantis ve 5 bit üs. Ancak, tüm üs kombinasyonları geçerli değildir. Yalnızca 0-28 arasındaki değerler çalışır ve hepsi etkin olarak negatiftir: sayısal değer . Bu, türün maksimum ve minimum değerlerinin +/- (2 96 -1) olduğu ve mutlak büyüklük bakımından sıfır olmayan en küçük sayının 10 -28 olduğu anlamına gelir .sign * mantissa / 10exponent

Derhal şunu belirteyim ki, bu uygulama nedeniyle, doubletemsil edilemeyecek türde sayılar olduğunu decimal- aralık dışında olanlar. Double.Epsilonbir 4.94065645841247e-324içinde temsil edilemez decimal, ancak bir olabilir double.

Bununla birlikte, ondalık basamağın temsil edebileceği aralık dahilinde, diğer yerel türlerden daha fazla hassasiyet biti vardır ve bunları hatasız olarak temsil edebilir.

Etrafta yüzen başka türler de var. C # 'da keyfi olarak büyük bir tamsayıyı temsil edebilen bir BigInteger var . Java'nın için hiçbir eşdeğer yoktur BigDecimal (2 up ondalık basamağı olan sayılar yukarı temsil edebilir 32 - olan oldukça büyük bir aralık uzun basamak) tam . Bununla birlikte, biraz dürtme yaparsanız, elle döndürülmüş uygulamaları bulabilirsiniz.

Ayrıca, rasyonelleri tam olarak temsil etmenizi sağlayan rasyonel bir veri tipine sahip bazı diller vardır (1/3 gerçekte 1/3).


Özellikle C # ve float veya rasyonel seçimi için, .NET'teki Ondalık kayan pint'den Jon Skeet'e erteleyeceğim :

Çoğu iş uygulaması muhtemelen yüzer veya çift değil de ondalık kullanıyor olmalıdır. Temel kural, para birimi gibi insan yapımı değerlerin genellikle ondalık kayan nokta ile daha iyi temsil edilmesidir: tam olarak 1,25 dolar kavramı, örneğin tamamen makul. Uzunluk ve ağırlıklar gibi doğal dünyadaki değerler için, ikili kayan nokta tipleri daha anlamlı olur. Teorik olarak "tam olarak 1.25 metre" olmasına rağmen, gerçekte asla gerçekleşmeyecek: kesinlikle kesin uzunlukları asla ölçemeyeceksiniz ve atomik seviyede bile var olma ihtimalleri çok düşük. Orada belirli bir tolerans varlığına alışkınız.


Net ve özlü bir matematiksel açıklama için +1. Ve başlıkta sorulan sorunun daha genel versiyonuna cevap vermek için, 10 tabanında gösterilemeyen bir sayı örneği 1/3'tür.
Doval,

@Doval Muhakeme veya açıklamamda daha matematik odaklı bir insanın işaret edebileceği bir aksaklık olduğundan şüpheliyim ... ama bu durumda doğru yolda olduğumu düşünüyorum.

Bu durumda "nispeten prime" sadece "bir faktör değil" anlamına gelir, değil mi? Kaybettiğim daha derin bir matematiksel ilişki var mı?
Patrick M,

1
Ah, anladığım kadarıyla n = 15ve oldukça asalb = 10 değiller ("1 dışında hiçbir ortak olumlu faktör paylaşmıyorlar") çünkü 5'i bir faktör olarak paylaşıyorlar. Kilit nokta, 15 (5 ve 3) faktörlerinin hepsinin de 10 faktör olmamasıdır. (Bir yana: tüm ortak faktörleri paylaşan veya paylaşmayan sayıları gösteren bir kelime var mı?) Denkleminize sarılmış , ancak başımı gerçekten sarmak için, 3B bir arsa görmem gerekiyor. Ne olursa olsun, sana iyi + 1 hak etti. k, n, m
Patrick M,

1
@PatrickM: "Kenara: tüm ortak faktörleri paylaşan veya paylaşmayan sayıları belirten bir kelime var mı?": Herhangi bir tamsayı, kendisinin bir faktörüdür, yani m'nin tüm faktörleri n'nin faktörleri ise , o zaman önemsizce takip eder: m , n'nin bir faktörüdür . Bunun için bir terim, açıkça bildiğiniz gibi, faktördür . Diğeri ise bölendir .
Ruakh

6

Kabul edilebilir değerler aralığının dışına çıktıktan sonra cevap evet olur. Bununla birlikte, aralık içindeki neredeyse her şeyin bir temsili olacaktır. C # Ondalık referans Belirtimde belirtilmediği halde irrasyonel sayılar tam olarak gösterilemez (örneğin, e 1 , pi, 2'nin karekökü, vb.).

Ondalık anahtar kelime, 128 bit veri türünü belirtir. Kayan nokta tipleriyle karşılaştırıldığında, ondalık tip daha büyük bir kesinlik ve daha küçük bir aralığa sahiptir, bu da finansal ve parasal hesaplamalar için uygun hale getirir. Ondalık tür için yaklaşık aralık ve hassasiyet aşağıdaki tabloda gösterilmiştir.

Hassasiyet: 28-29 anlamlı basamak

1 Bana başka bir irrasyonel sayıyı hatırlattığı için MichaelT'e teşekkürler.


2
@ Magus irrasyonel sayıyı düşünün e(2.71 ...). Doğal log - ln (x) log tabanı e'dir. Böylece irrasyonel bazlar mevcuttur ve faydalıdır. Baz pi'nin özel kullanışlılığı, emin değilim - ama bu bir yerde kullanılmadığı anlamına gelmez.

6
@Max, matematik sorularına giderek daha fazla saptıyorsunuz. Sen bulabilirsiniz sayı 10 tabanına irrasyonel ise, diğer bazlar içinde akıldışıdır? Yararlı bir okuma ve daha fazla sayıda teori sorusu için bir başlangıç ​​noktası olmak.

2
1 / 3'ü irrasyonel değil.
Adam Zuckerman

2
OP, 10 tabanını istedi (on). Herhangi bir sayıdaki sistem tabanını yapmak, herhangi bir şeyi 10 olarak ifade etmenize izin verecektir. Wikipedia makalesine göre , bir irrasyonel sayıyı taban olarak kullanmak rasyonel yapmaz. Rasyonel sayılar, hem pay hem de payda için tamsayılar olarak ifade edilebilir, sayıları ondalık basamakta tekrar eder veya sayıların ondalık biçimde sonlandırılmasını sağlar.
Adam Zuckerman

5
@FrustratedWithFormsDesigner Mantıksızlığın üslerle hiçbir ilgisi yok. Eh, bu bir abartıdır, ancak sayının farklı tabanlarda (örneğin, yinelenmeyen rakamlara sahip olup olmadığı), sayısız temsili için çıkarımları olan irrasyonalitedir. Yukarıya bağlı math.se sorusunu okuyun: math.stackexchange.com/questions/625473/…

1

Bir taban iki kayan nokta tipi , aynı büyüklükteki bir on taban tipinin yapamayacağı birçok değeri kesin olarak gösterebilecektir . Baz-2 tipi bir beden tarafından tam olarak gösterilebilecek herhangi bir değer, baz-on yeterli büyüklükte bir tipte tam olarak gösterilebilir. İkili kayan nokta sayısının tüm değerlerini temsil etmek için tamamen baz on tipi için gereken ebat, ikili tipin üssel aralığına bağlı olacaktır; yüzlerce bit, bir süre floatbinlerce double.

Having been dedi ki, Decimaltip başka herhangi bir sayısal ilkel değerini tutabilen yazın bir "evrensel" olarak kullanışlı olmasını (yanında diğer bazı ek özellikleri sağlamak için mümkün olurdu yeterince büyük olması durumunda başka bir şey, kullanım tek bitlik saklanan değerin a dönüştürmesinin sonucu olup olmadığını belirtmek için doubleve bu bit ayarlanmışsa, söz konusu değeri tutmak için 64 bit kullanın). Ancak Microsoft bunu yapmamayı tercih etti. Sonuç olarak, bir dönüşüm doubleiçin Decimal, büyük değerler için tamamen başarısız olur küçük değerler en yakın 1E-28 yuvarlanır neden olur. Ayrıca, dinamik aralık dahilinde biledecimal, dönüşüm yöntemi "gidiş-dönüş" olmaz. Örneğin, 1.0 / 3.0'ı çift olarak değerlendirmek 0.333333333333333333148'i verir, ancak onu ondalık değere dönüştürmek 0.333333333333333m verir ve bunu tekrar ikiye dönüştürür 0.333333333333332989818.

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.