0

Ondalıktan IEEE 754 - here'a nasıl dönüştürüleceğini öğrendim, ancak postada açıklanan yöntemle bölmek zorunda kalmadan çok büyük bir sayıyı nasıl dönüştüreceğimi bilmiyorum.Büyük bir sayıyı (örneğin, 1.23e29) IEE 754 tek kesinlikli kayan noktalı biçime nasıl dönüştürebilirim?

Örneğin, -1.5845632e29'u IEEE 754 tek duyarlıklı kayan noktaya dönüştürmem gerekiyor, bu büyük sayının günlük 2 tabanını elde etmenin en kolay yolu var mı?

+0

büyük sayılar ekleyerek IEEE üs hesaplayın. Neden sadece bignum kütüphanesi kullanmıyorsun? –

+0

-1.5845632e29, IEEE-754 'binary32' numarası ile temsil edilebilir aralık dahilindedir. Üssü elde etmek için log2'yi hesaplamak neden sorun olur? En kötü durumda, sonuç [1,2] içinde olana kadar her adımdaki sayıyı yarıya indiren bir yineleme ile hesaplanabilir. – njuffa

+1

Temel dönüşümleri gerçekleştirme * doğru * zor bir sorundur, bir başlangıç ​​noktası olarak aşağıdaki makaleye başvurmanızı öneririm: William D.Clinger, "Kayan nokta sayıları nasıl doğru şekilde okunur." * ACM SIGPLAN Bildirimleri * 39.4 (2004): 360-371. – njuffa

cevap

1

Aşağıdaki örnekler Python'u kullanır. Bunun, hesaplamak için hızlı bir şekilde çok doğru bir yanıttan daha fazla ilgilendiğinizi varsayar.

Her şey için temel 2'yi kullanamazsınız, bu yalnızca size mantıklı bir üs verir. Daha sonra mantıyı bulmak için, üssel sonucun kesirli parçasını bölebilir ve bu güce iki kez daha yükselebilir, daha sonra iki ile çarpın, mantissa bitlerinin sayısının gücü ile çarpın. İşaretin ayrı ayrı ele alınması gerekir.

math.log(1.5845632e29, 2) 
96.99999995421683 
hex(int(math.floor(2**0.99999995421683*2**23))) 
'0xffffff' 

, tüm kombine olarak, kayma mantis ima bir maske için:

aşağıdaki (heks olarak gösterilen 1 + 23 bit) bir (önyargı olmaksızın) üs ve mantisi verir

hex((0xffffff & 0x7fffff) | ((96+127) << 23) | (1 << 31)) 

yukarıdaki tekniği bazı sınırlamalar vardır - durumları yakalamak değildir ve doğrulukla sorunlar olabilir: üs + önyargı ve tabelada biraz alır. Ve küçük sayılar için mantıyı hesaplamak için negatif fraksiyonu kullanmanız gerektiğine dikkat edin. Bunu daha kesin ya da farklı formatlar için yapmak için, kayan noktalı matematik işlevleri olmadan her şeyi yapmanız gerekebilir.

Aracınız veya diliniz rasgele büyük tam sayıları destekliyorsa, iyi çalışan bir teknik için zor adımlar şunlardır. Bu, Python'da, örn. C özel kütüphanelere ihtiyacınız var.

  1. yuvarlama uygulamak, ihtiyacınız mantis bit sayısı kuvveti iki tarafından sadece
  2. Multiply altında iki kat güç bul gerçek değeri
  3. büyük bir tamsayı olarak numarayı herhangi gerekli Yazın sonra üssü sağa kaydır.
  4. bir IEEE-754 formatında uymayabilir önyargı
İlgili konular