浮点加法,无浮点!


9

您的任务是用任何一种语言编写一个程序,该程序无需使用任何分数或浮点数学运算即可将两个浮点数加在一起。允许使用整数数学。

格式

数字的格式是包含1和0的字符串,它们表示IEEE 754 32位float的二进制值。例如,数字2.54将由字符串“ 010000000010001010001000111101011100”表示。

目标

您的程序应以上述格式输入两个数字,将它们加在一起,然后以相同格式输出结果。任何语言中最短的答案都将赢得!

规则

绝对不允许使用浮点数,十进制或任何类型的非整数数学函数。

您可以假设输入是干净的(即仅包含1和0)。

您可以假定输入是数字,而不是Inf,-Inf或NaN或次正规量。但是,如果结果大于最大值或小于最小值,则应分别返回Inf和-Inf。异常(异常)结果可能会刷新为0。

您不必正确处理舍入。如果您的结果有些出众,请不要担心。

测验

要测试您的程序,您可以使用此工具在十进制和浮点二进制数之间转换。

1000 + 0.5 = 1000.5

01000100011110100000000000000000 + 00111111000000000000000000000000 = 01000100011110100010000000000000

float.MaxValue + float.MaxValue =无穷大

01111111011111111111111111111111 + 01111111011111111111111111111111 = 01111111100000000000000000000000

321.123 + -123.321 = 197.802

01000011101000001000111110111110 + 11000010111101101010010001011010= 01000011010001011100110101010000

祝好运!

Answers:


3

Python,224个字符

此代码将浮点输入f转换为整数f*2^150,使用python本地大整数进行加法运算,然后转换回去。

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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.