Kayan nokta eklenmesi, şamandıra olmadan!


9

Göreviniz herhangi bir dilde, herhangi bir kesirli veya kayan nokta matematiği OLMADAN birlikte iki kayan nokta sayısı ekleyen bir program yazmaktır . Tamsayı matematiğine izin verilir.

Biçim

Sayıların formatı, bir IEEE 754 32 bit kayan değerin ikili değerini temsil eden 1'ler ve 0'lar içeren dizelerdir . Örneğin, 2.54 sayısı "01000000001000101000111101011100" dizesiyle temsil edilir.

Hedef

Programın yukarıda belirtilen biçimde iki sayı girmesi, bir araya getirmesi ve sonucu aynı biçimde çıkarmanız gerekir. Herhangi bir dilde en kısa cevap kazanır!

kurallar

Kesinlikle hiçbir kayan nokta, ondalık veya tamsayı olmayan matematik fonksiyonlarına izin verilmez.

Girişin temiz olduğunu varsayabilirsiniz (yani yalnızca 1'ler ve 0'lar içerir).

Girişlerin sayı olduğunu, Inf, -Inf veya NaN veya altnormal olmadığını varsayabilirsiniz. Ancak, sonuç maksimum değerden büyük veya minimum değerden küçükse, sırasıyla Inf ve -Inf değerlerini döndürmelisiniz. Subnormal (denormal) bir sonuç 0'a akıtılabilir.

Yuvarlamayı düzgün işlemeniz gerekmez. Sonuçlarınız birkaç bit ise endişelenmeyin.

Testler

Programlarınızı test etmek için, bu aracı kullanarak ondalık ve kayan nokta ikili sayıları arasında dönüştürme yapabilirsiniz .

1000 + 0.5 = 1000.5

01000100011110100000000000000000 + 00111111000000000000000000000000 = 01000100011110100010000000000000

float.MaxValue + float.MaxValue = Sonsuzluk

01111111011111111111111111111111 + 01111111011111111111111111111111 = 01111111100000000000000000000000

321.123 + -123.321 = 197.802

01000011101000001000111110111110 + 11000010111101101010010001011010= 01000011010001011100110101010000

İyi şanslar!

Yanıtlar:


3

Python, 224 karakter

Bu kod, bir kayan nokta girişini ftamsayıya dönüştürür f*2^150, eklemeyi python yerel büyük tamsayılarını kullanarak yapar, sonra geri dönüştürür.

V=lambda x:((-1)**int(x[0])<<int(x[1:9],2))*int('1'+x[9:],2)
B=lambda x,n:B(x/2,n-1)+'01'[x&1]if n else''
def A(x,y):
 v=V(x)+V(y)
 s=e=0
 if v<0:s=1;v=-v
 while v>=1<<24:v/=2;e+=1
 if e>254:v=0
 return'%d'%s+B(e,8)+B(v,23)

3

J (172 karakter)

IEEE 754 beş yuvarlama kuralına izin verdiğinden, "0'a doğru" kuralını seçtim. İşte benim kod:

b=:(_1&^)@".@{.*[:#.1x,("."0)@(9&}.),#.@:("."0)@}.@(9&{.)$0:
a=:b@[([:,(<&0)":"0@:,,@((8$2)&#:)@(-&24)@$@#:,}.@(24&{.)@#:@|)@(]`(**2x^278"_)@.((>&((2x^278)-2x^254))@|))@+b@]

Verdiğiniz aynı örnekler (ancak farklı yuvarlama kuralı nedeniyle tam olarak aynı sonuçlar değil):

   '01000100011110100000000000000000' a '00111111000000000000000000000000'
01000100011110100010000000000000
   '01111111011111111111111111111111' a '01111111011111111111111111111111'
01111111100000000000000000000000
   '01000011101000001000111110111110' a '11000010111101101010010001011010'
01000011010001011100110101001111
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.