การเติมจุดลอยตัวโดยไม่มีการลอยตัว!


9

งานของคุณคือการเขียนโปรแกรมในภาษาใด ๆ ที่เพิ่มตัวเลขทศนิยมสองตัวพร้อมกันโดยไม่ต้องใช้เลขเศษส่วนหรือทศนิยมใด ๆ อนุญาตให้ใช้เลขจำนวนเต็ม

รูปแบบ

รูปแบบสำหรับตัวเลขที่เป็นสตริงที่มี 1 และ 0 ซึ่งเป็นตัวแทนของค่าไบนารีของIEEE 754 ลอย ตัวอย่างเช่นหมายเลข 2.54 จะแทนด้วยสตริง "01000000001000101000111101011100"

เป้าหมาย

คุณโปรแกรมควรป้อนตัวเลขสองตัวในรูปแบบที่กล่าวถึงข้างต้นรวมเข้าด้วยกันและส่งออกผลลัพธ์ในรูปแบบเดียวกัน คำตอบที่สั้นที่สุดในทุกภาษาชนะ!

กฎระเบียบ

ไม่อนุญาตให้ใช้ฟังก์ชันทศนิยมจุดทศนิยมหรือฟังก์ชันคณิตศาสตร์ที่ไม่ใช่จำนวนเต็มชนิดใด ๆ

คุณสามารถสันนิษฐานได้ว่าอินพุตนั้นสะอาด (เช่นมีเพียง 1 และ 0)

คุณสามารถสันนิษฐานได้ว่าอินพุตเป็นตัวเลขไม่ใช่ Inf, -Inf หรือ NaN หรือ subnormal อย่างไรก็ตามหากผลลัพธ์มากกว่าค่าสูงสุดหรือเล็กกว่าค่าขั้นต่ำคุณควรส่งคืน Inf และ -Inf ตามลำดับ ผลลัพธ์ย่อย (denormal) อาจถูกลบทิ้งเป็น 0

คุณไม่จำเป็นต้องจัดการการปัดเศษอย่างเหมาะสม ไม่ต้องกังวลหากผลลัพธ์ของคุณมีน้อย

การทดสอบ

เพื่อทดสอบโปรแกรมของคุณคุณสามารถแปลงระหว่างเลขฐานสองทศนิยมและทศนิยมโดยใช้เครื่องมือนี้

1000 + 0.5 = 1,000.5

01000100011110100000000000000000 + 00111111000000000000000000000000 = 01000100011110100010000000000000

float.MaxValue + float.MaxValue = อินฟินิตี้

01111111011111111111111111111111 + 01111111011111111111111111111111 = 01111111100000000000000000000000

321.123 + -123.321 = 197.802

01000011101000001000111110111110 + 11000010111101101010010001011010= 01000011010001011100110101010000

โชคดี!

คำตอบ:


3

Python 224 ตัวอักษร

รหัสนี้แปลงอินพุตจุดลอยตัวfเป็นจำนวนเต็มf*2^150ทำการเพิ่มโดยใช้ไพ ธ อนใหญ่จำนวนเต็มจากนั้นแปลงกลับ

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 ตัวอักษร)

เนื่องจาก IEEE 754 อนุญาตให้มีห้ากฎการปัดเศษฉันเลือกกฎ "ไปยัง 0" นี่คือรหัสของฉัน:

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

ตัวอย่างเดียวกันที่คุณให้ (แต่ไม่เหมือนกันทุกประการเพราะกฎการปัดเศษที่แตกต่างกัน):

   '01000100011110100000000000000000' a '00111111000000000000000000000000'
01000100011110100010000000000000
   '01111111011111111111111111111111' a '01111111011111111111111111111111'
01111111100000000000000000000000
   '01000011101000001000111110111110' a '11000010111101101010010001011010'
01000011010001011100110101001111
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.