2009-11-24 14 views

cevap

14

No

en azından bir kısmı bit bir üs (ikili noktanın konumu) temsil etmek için kullanılmaktadır, ve bu nedenle gerçek sayısı için 64 bitten daha az bulunmaktadır gereken 64 bitlik çift . Yani hayır, 64 bitlik bir çift tüm değerleri 64 bitlik bir tam sayıyı (ve tam tersini) temsil edemez.

+1

Eh - kayan nokta sayısı ve 64b tamsayı arasında hiçbir eşleme işlevi olmadığı sürece bu geçerlidir. Sayıyı farklı bir kayan nokta sayısı olarak "temsil edebilir". Pratik değil :) – viraptor

+2

Uygulanamaz çözüm bile işe yaramayabilir - örneğin bir NaN (SNaN) değeri, Lua içinde ele alındığında bir istisna tetikleyebilir (bunun doğru olup olmadığı konusunda bir fikir yoktur - ama olabilir). – stusmith

+1

Çiftler için bazı değerler denormalize edilir - eğer diliniz uyarı vermeden onları normale döndürüyorsa, bunlara 64 bit bilgi sığdıramazsınız. – bdonlan

4

çift 64 bitlik bir türü kendisidir. Ancak, işaret için 1 bit ve üs için 11 kaybedersiniz.

Yani cevap hayır: o yapılamaz.

+3

bir bit kazanırsınız, çünkü en yüksek olanı her zaman sıfır değildir, yani hassasiyet “total_bits - sign_bit - exp_bits + implicit_bit = 64 - 1 - 11 + 1 = 53” – Christoph

+0

Açıklamanızı anlamıyorum. Artan bir sayısal aralık için işaret bitini 'yanlış kullanabilecek' olduğunu anlıyorum. (Yani pozitif aralığı artırmak için temelde negatif sayıları kullanarak) – Toad

+1

@reiner. Örneğin, 53 ondalık rakamı olsa bile, ikili ondalık 0,01 ... (51 daha fazla 1 ...) 1 tam olarak IEEE çiftinde temsil edilebilir. Bu, -2 bir üssü (11 bit alarak), 0 işareti (1 bit alarak) ve 1 ... (50 1s) ... 1 (52 bit alarak) bir mantis ile temsil edilir. İlk 1 hiçbir yerde kayıtlı değil, varsayıldı. Her zaman mantisin "ilk" biti 1 olacak şekilde bir üs seçin, böylece ilk bit sadece dışarıda bırakılır. İstisna, biraz farklı şekilde ele alınan (ya da hiç olmayan) denorms'dir. –

-1

i lua
hakkında hiçbir şey biliyorum ama bu dilde şamandıra bit cinsinden manipülasyon nasıl gerçekleştirileceği anlamaya eğer, sen teoride bir dize forma numarasını aldı bir sarmalayıcı sınıf oluşturun ve ayarlayabilirsiniz sayısını gösterir sırayla float bitleri bunu
daha pratik bir çözüm bazı bignum kütüphaneye hafızasından

3

, bir double 53 bitlik işaretli tamsayı tam olarak temsil edebilir kullanmak olacaktır verdi.

1

64 bit'te yalnızca 2^64 farklı kod kaydedebilirsiniz. Bu, 2^64 tamsayıyı temsil edebilen 64-bit bir türün, kayan nokta sayıları gibi başka bir şeyi temsil edecek herhangi bir yere sahip olmadığı anlamına gelir.

Açıkça iki katı tam sayı olmayan sayıları temsil edebilir, bu nedenle gereksinimlerinizi karşılayamaz.

5

64 bit türler hakkındaki sorunuza iyi yanıtlar almanıza rağmen, belirli sorunlarınız için pratik bir çözüm isteyebilirsiniz. Bildiğim en güvenilir çözüm Lua 5.1'den LuaForge'dan indirilebilen LNUM yaması (Lua tamsayı yaması olarak da bilinir) oluşturmaktır. Lua'yı C kaynağından oluşturmayı planlamıyorsanız, 64 bit imzalı tam sayıları işleyen en az bir saf Lua kütüphanesi vardır - Lua kullanıcıları wiki'sine bakın.

+0

Referanslar için teşekkürler, +1. –

2

Hayır, hassasiyeti kaybetmeden 64 bit tam sayıları depolamak için Double'i kullanamazsınız. Ancak, Lua yorumlayıcısına gerçek 64 bit tamsayılar için destek ekleyen bir Lua yaması uygulayabilirsiniz. Lua kaynağınıza LNUM yamasını uygulayın ve yeniden derleyin.

0

IEEE 754 çifte tam olarak 64 bit tam sayıları temsil edemez. Bununla birlikte, tam olarak her 32 bit tam sayı değerini temsil edebilir.