Selain titik mengambang, tanpa mengapung!

9

Tugas Anda adalah untuk menulis sebuah program, dalam bahasa apapun, yang menambahkan dua angka floating point bersama-sama TANPA menggunakan setiap matematika titik pecahan atau mengambang. Matematika integer diizinkan.

Format

Format untuk angka adalah string yang berisi 1 dan 0 yang mewakili nilai biner dari pelampung 32-bit IEEE 754 . Misalnya angka 2.54 akan diwakili oleh string "01000000001000101000111101011100".

Tujuan

Program Anda harus memasukkan dua angka dalam format yang disebutkan di atas, menambahkannya bersama-sama, dan menghasilkan hasilnya dalam format yang sama. Jawaban terpendek dalam bahasa apa pun menang!

Aturan

Sama sekali tidak diperbolehkan fungsi floating point, desimal, atau jenis matematika non-integer lainnya.

Anda dapat mengasumsikan bahwa inputnya bersih (yaitu hanya berisi 1 dan 0).

Anda dapat mengasumsikan bahwa input adalah angka, dan bukan Inf, -Inf, atau NaN atau subnormal. Namun, jika hasilnya lebih besar dari nilai maks atau lebih kecil dari nilai min, Anda harus mengembalikan Inf dan -Inf masing-masing. Hasil subnormal (tidak normal) dapat memerah ke 0.

Anda tidak harus menangani pembulatan dengan benar. Jangan khawatir jika hasilnya sedikit keluar.

Tes

Untuk menguji program Anda, Anda dapat mengonversi antara angka biner titik desimal dan mengambang menggunakan alat ini .

1000 + 0,5 = 1000,5

01000100011110100000000000000000 + 00111111000000000000000000000000 = 01000100011110100010000000000000

float.MaxValue + float.MaxValue = Infinity

01111111011111111111111111111111 + 01111111011111111111111111111111 = 01111111100000000000000000000000

321.123 + -123.321 = 197.802

01000011101000001000111110111110 + 11000010111101101010010001011010= 01000011010001011100110101010000

Semoga berhasil!

Hannesh
sumber

Jawaban:

3

Python, 224 karakter

Kode ini mengkonversi input floating point fke integer f*2^150, melakukan penambahan menggunakan integer besar python asli, lalu mengkonversi kembali.

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)
Keith Randall
sumber
3

J (172 karakter)

Karena IEEE 754 memungkinkan lima aturan pembulatan, saya memilih aturan "menuju 0". Ini kode saya:

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

Contoh yang sama yang Anda berikan (tetapi bukan hasil yang persis sama karena aturan pembulatan yang berbeda):

   '01000100011110100000000000000000' a '00111111000000000000000000000000'
01000100011110100010000000000000
   '01111111011111111111111111111111' a '01111111011111111111111111111111'
01111111100000000000000000000000
   '01000011101000001000111110111110' a '11000010111101101010010001011010'
01000011010001011100110101001111
Thomas Baruchel
sumber