çift ​​olarak saklanabilecek en büyük tam sayı


Yanıtlar:


507

Hassasiyeti kaybetmeden bir çiftte saklanabilecek en büyük / en büyük tamsayı, bir çiftin mümkün olan en büyük değeri ile aynıdır. Yani DBL_MAXveya yaklaşık 1.8 × 10 308 (eğer çiftliğiniz bir IEEE 754 64-bit çift ise). Bu bir tamsayı. Tam olarak temsil ediliyor. Daha fazla İstediğiniz ne?

Devam et, bana en büyük tamsayının ne olduğunu sor, böylece daha küçük tamsayılar IEEE 64-bit'te iki katına çıkmadan kesilebilir. Bir IEEE 64-bit çiftinin 52 bit mantis var, bu yüzden 2 53 olduğunu düşünüyorum :

  • 2 53 + 1 kaydedilemez, çünkü başlangıçtaki 1 ve sondaki 1 arasında çok fazla sıfır vardır.
  • 2 53'ten az herhangi bir şey saklanabilir, 52 bit mantis içinde açıkça saklanır ve daha sonra yürürlükteki üs size başka bir tane verir.
  • 2 53 , 2 küçük bir güç olduğu için saklanabilir.

Ya da başka bir bakış açısı: önyargı üs dışına çıkarıldıktan ve işaret bitini soru ile ilgisiz olarak göz ardı ettikten sonra, bir çift tarafından depolanan değer 2'nin gücü ve 2 ile çarpılan 52 bitlik bir tamsayıdır. üs - 52 . Yani üs 52 ile size 2'den tüm değerleri saklayabilir 52 2 kadar 53  2 sonra Sonra üs 53 ile, bir sonraki numara saklayabilir - 1. 53 2 53 + 1 × 2 52-53 . Bu yüzden önce hassasiyet kaybı 2 53 + 1 ile gerçekleşir.


126
+1 Sorunun gerçekten de askerin muhtemelen neyi amaçladığı ve her iki yanıtı da sağladığı ("teknik olarak doğru" ve "muhtemelen beklenen") anlamına gelmediğini fark etmek iyi bir iştir.
Pascal Cuoq

62
Ya da ben onları aramak eğiliminde olarak "hakkında karışıklık" ve "yardım etmeye çalışıyorum"
Steve Jessop

8
Midilli Tony'ye boyun eğiyorum, başka kimse yok.
Steve Jessop

11
"Tüm küçük tamsayılar" anlamına gelmez, eşit veya daha küçük büyüklükte tamsayılar anlamına gelir. Çünkü 2 ^ 53'ün altında çok sayıda negatif tamsayı vardır ve tam olarak bir çiftte temsil edilemez.
Güney Misafirperverliği

13
Daha küçük kastediyorum ve daha küçük dediğimde tam olarak bu demek istiyorum :-) -1.000.000 1'den az, ama daha küçük değil.
Steve Jessop

77

9007199254740992 (bu 9.007.199.254.740.992) garantisizdir :)

program

#include <math.h>
#include <stdio.h>

int main(void) {
  double dbl = 0; /* I started with 9007199254000000, a little less than 2^53 */
  while (dbl + 1 != dbl) dbl++;
  printf("%.0f\n", dbl - 1);
  printf("%.0f\n", dbl);
  printf("%.0f\n", dbl + 1);
  return 0;
}

Sonuç

9007199254740991
9007199254740992
9007199254740992

7
'Yakın' ancak 2 ^ N'den daha az olacağını varsayarsak double dbl = 1; while (dbl + 1 != dbl) dbl *= 2; while (dbl == --dbl);, aynı sonucu veren daha hızlı bir test olur
Seph

4
@ Ne güzel ...? Hayır? while (dbl == --dbl)sonsuza dek dönecek veya hiç dönmeyecek. :) (bu durumda, hiç değil, çünkü 2 ^ N). Aşağıdan yaklaşmanız gerekecek. Gerçekten de beklenen sonuçtan bir daha az ile sonuçlanacaktır (while döngüsünde bir kontrol dbl azaldığı için). Ve bu, sol tarafın değerlendirilmesinden önce veya sonra (ki bildiğim kadarıyla tanımlanmamış) yapılırsa, yürütme sırasına bağlıdır. Eğer eskisi ise, her zaman doğru olacak ve sonsuza kadar döngü yapacak.
falstro

10
Belki bir yerde 2 ^ 53 = 9,007,199,254,740,992 olduğunu belirtin.
Xonatron

1
Bununla tartışmak zor! Güzel deney
MattM

Kullanmanın bir zayıflık while (dbl + 1 != dbl) dbl++;ki dbl + 1 != dblkullanılarak değerlendirebilir long doublematematik - düşünün FLT_EVAL_METHOD == 2. Bu sonsuz bir döngü ile sonuçlanabilir.
chux - Monica'yı

25

Wikipedia, IEEE 754 bağlantısıyla aynı bağlamda şunu söylemektedir :

Tipik bir bilgisayar sisteminde, 'çift kesinlikli' (64 bit) ikili kayar nokta sayısı 53 bitlik (biri zımni), 11 bitlik bir üs ve bir işaret bitine sahiptir.

2 ^ 53 9 * 10 ^ 15'in biraz üzerindedir.


@Steve Jessop az çok söylüyorum. Ayrıca hala IEEE uyumlu olması gereken bir FPU'ya sahip olmayan donanım sistemleriyle de karşılaştım, böylece 8 ay sonra buraya geri dönüp aynı bilgiye ihtiyaç duyduğumda "tipik sistem" şeyler gerçekten bana yardımcı olmaz 68K tabanlı mikrodenetleyicim (FPU'su olmadığı varsayılarak ... hatırlayamıyorum).
San Jacinto

14
@San Jacinto - "Bu işe yaramaz" aşırı derecede serttir. Cevap oldukça kullanışlıdır, tipik bilgisayar sistemlerinin gerçekten IEEE 754 yenilemesini kullandığı yorumunu içermesi kadar faydalı değildir.
Stephen C. Steel

@Stephen C. Steel, aslında haklısınız. Benim senaryomda, daha sonra buna geri dönüp IEEE max'ı aramak, 'tipik bir sistemin' ne olduğuna inanılmaz derecede belirsizdir, ancak bu şikayetin yanı sıra hala cevapta değer vardır.
San Jacinto

20

IEEE 754 çift (64-bit) ile temsil edilebilecek en büyük tamsayı, türün temsil edebileceği en büyük değerle aynıdır, çünkü bu değerin kendisi bir tamsayıdır.

Bu, 0x7FEFFFFFFFFFFFFFaşağıdakilerden oluşan şu şekilde temsil edilir :

  • İşaret biti 1 yerine 0 (pozitif)
  • Azami üs 0x7FE(sapma çıkarıldıktan sonra 1023'ü temsil eden 2046) yerine 0x7FF(a NaNveya sonsuzluğu gösteren 2047 ).
  • 0xFFFFFFFFFFFFF52 bit olan maksimum mantis hepsi 1.

İkilide, değer örtük 1'dir, ardından mantisten 52 tane, daha sonra üssünden 971 sıfır (1023 - 52 = 971) gelir.

Tam ondalık değer:

179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368

Bu yaklaşık 1.8 x 10 308'dir .


Peki ve sıfır arasındaki bitişik olarak temsil edilebilen tüm değerlerle temsil edebileceği en büyük değere ne dersiniz?
Aaron Franke

@AaronFranke Soru bitişik temsil hakkında soru sormadı, ancak bu farklı sorunun cevabı diğer birçok cevaba dahil edildi, hatta gerçek cevap olarak yanlış verildi. 2⁵³ (53'ün gücüne 2).
Simon Biber

8

Mantis büyüklüğüne bakmanız gerekir. Bir IEEE 754 64 bit kayan nokta sayısı (52 bit, artı 1 ima edilmiş), mutlak değeri 2 ^ 53'e eşit veya daha düşük olan tam sayıları tam olarak temsil edebilir.


8
Tam olarak 2 ^ 53'ü de temsil edebilir :-)
Steve Jessop

6

2
bu cevap bir alıntı ile çok daha iyi olurdu.
San Jacinto

2
@Karal, eğer tamsayı solda sıfırlar varsa, o zaman tam olarak saklanır.
Wilhelm

4
@all Eğer downvoters: 1,7976931348623157 × 10 ^ 308 olan tam bir tam sayı. Hepiniz iyileştirici matematik derslerine veya başka bir şeye katılmanız mı gerekiyor?
Dan Moulding

6
Bu umutsuzca batmış cevabın tartışmasında anlambilimden aşağıdayız. Doğru, bu sayı tam olarak temsil edilebilir ve böylece sorunun harfini yerine getirir. Ancak hepimiz biliyoruz ki, bu, yakın özlemlerden oluşan bir okyanustaki küçük bir doğruluk adasıdır ve çoğumuz, soruyu doğru bir şekilde "hassasiyetin boşa gittiği en büyük sayı" anlamına getirmek için enterpolasyonlu hale getirdik. Ah, CompSci'nin kesin bir bilim olması harika değil mi? :)
Carl Smotricz

2
@DanMoulding 1.7976931348623157 × 10 ^ 308 tam bir tamsayıdır, ancak bu tamsayı tam olarak bir çiftte saklanamayacağından eminim.
Pascal Cuoq

2

DECIMAL_DIGdan <float.h>bu en azından makul bir yaklaşım vermelidir. Bu ondalık basamaklarla uğraştığından ve gerçekten ikili olarak saklandığından, büyük olasılıkla hassasiyeti kaybetmeden biraz daha büyük bir şey saklayabilirsiniz , ancak tam olarak ne kadar zor olduğunu söyleyebilirsiniz. Sanırım bunu anlayabilmelisin FLT_RADIXve DBL_MANT_DIG, ama sonuca tamamen güveneceğime emin değilim.


Bu soruya bir cevap sağlamaz. Bir yazardan eleştiri veya açıklama istemek için gönderilerinin altına bir yorum bırakın.
MichaelChirico

@MichaelChirico: Bu, cevap yazarken olduğu gibi sormayı amaçladığı soruyu cevaplar. Sorunun düzenleme geçmişini görmek için, sorunun altındaki "19 Haziran 14, 11:40 tarihinde düzenlenmiş" bağlantısını tıklayın.
Jerry Coffin

cevabınız bir yorum gibi okunuyor, çünkü bir cevabın sahip olması gereken güven / otoriterlikten yoksun gibi görünüyor ("en azından makul bir ..." "tam olarak ne kadar ... demek zor" "sanırım ..." "). Sorulan soru veya cevap konusunda uzmanlığım yok, bu yüzden yanlış olabilirim; sadece verilen iki sent koyarak inceleme kuyruğundan buraya gönderildi (sanırım diğer kullanıcıların cevabınızı işaretlediği anlamına gelir).
MichaelChirico

1
@MichaelChirico: Sahip olabilirler - konuyu bilmeyen tek kişiden uzaktasınız; sizi alışılmadık yapan şey, onu bilmemenizdir. C'deki bir kayan nokta sayısının kesinliği hakkında yetkili görünen çoğu cevap yanlıştır. Örneğin, bunların çoğu (çoğu) doubledoğrudan belirli bir IEEE tipine karşılık gelen yanlış varsayımlara dayanır , ancak bu gerekli değildir ve bu cevap yazıldığında soru belirli bir IEEE tipinden de bahsetmedi.
Jerry Coffin

anladım. Belki de bu bilgiyi cevaba eklemenizi öneririm.
MichaelChirico
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.