Thêm điểm nổi, không có phao!


9

Nhiệm vụ của bạn là viết một chương trình, bằng bất kỳ ngôn ngữ nào, cộng hai số dấu phẩy động lại với nhau mà KHÔNG sử dụng bất kỳ phép toán phân số hoặc dấu phẩy động nào. Toán học số nguyên được cho phép.

định dạng

Định dạng cho các số là các chuỗi chứa 1 và 0 đại diện cho giá trị nhị phân của số float 32 bit 32 bit của IEEE . Ví dụ, số 2.54 sẽ được biểu thị bằng chuỗi "01000000001000101000111101011100".

Mục tiêu

Chương trình của bạn nên nhập hai số theo định dạng đã đề cập ở trên, cộng chúng lại với nhau và xuất kết quả theo cùng định dạng. Câu trả lời ngắn nhất trong bất kỳ ngôn ngữ nào sẽ thắng!

Quy tắc

Tuyệt đối không cho phép dấu phẩy động, số thập phân hoặc bất kỳ loại hàm toán học không nguyên nào.

Bạn có thể giả sử rằng đầu vào sạch (tức là chỉ chứa 1 và 0).

Bạn có thể giả sử rằng các đầu vào là số chứ không phải Inf, -Inf hoặc NaN hoặc không bình thường. Tuy nhiên, nếu kết quả lớn hơn giá trị tối đa hoặc nhỏ hơn giá trị tối thiểu, bạn nên trả về Inf và -Inf tương ứng. Một kết quả không bình thường (không bình thường) có thể bị xóa thành 0.

Bạn không phải xử lý làm tròn đúng cách. Đừng lo lắng nếu kết quả của bạn là một vài bit.

Xét nghiệm

Để kiểm tra các chương trình của bạn, bạn có thể chuyển đổi giữa các số nhị phân dấu thập phân và dấu phẩy động bằng công cụ này .

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

Chúc may mắn!

Câu trả lời:


3

Python, 224 ký tự

Mã này chuyển đổi một đầu vào dấu phẩy động fthành số nguyên f*2^150, thực hiện phép cộng bằng cách sử dụng các số nguyên lớn gốc python, sau đó chuyển đổi trở lại.

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 ký tự)

Vì IEEE 754 cho phép năm quy tắc làm tròn, tôi đã chọn quy tắc "về 0". Đây là mã của tôi:

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

Các ví dụ rất giống bạn đưa ra (nhưng không chính xác cùng một kết quả do quy tắc làm tròn khác nhau):

   '01000100011110100000000000000000' a '00111111000000000000000000000000'
01000100011110100010000000000000
   '01111111011111111111111111111111' a '01111111011111111111111111111111'
01111111100000000000000000000000
   '01000011101000001000111110111110' a '11000010111101101010010001011010'
01000011010001011100110101001111
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.