浮動小数点なしの浮動小数点加算!


9

あなたの仕事は、任意の言語で、小数または浮動小数点の数学を使用せずに 2つの浮動小数点数を加算するプログラムを記述することです。整数演算が許可されています。

フォーマット

数値の形式は、IEEE 754 32ビットfloatのバイナリ値を表す1と0を含む文字列です。たとえば、数値2.54は文字列 "01000000001000101000111101011100"で表されます。

ゴール

プログラムは、上記の形式で2つの数値を入力し、それらを加算して、同じ形式で結果を出力する必要があります。どの言語でも最も短い答えが勝ちます!

ルール

浮動小数点、10進数、または整数以外のあらゆる種類の数学関数は絶対に許可されていません。

入力はクリーン(つまり、1と0のみを含む)であると想定できます。

入力は数値であり、Inf、-Inf、NaNまたは非正規ではないと想定できます。ただし、結果が最大値より大きいか最小値より小さい場合は、それぞれInfと-Infを返す必要があります。非正規(非正規)の結果は0にフラッシュされることがあります。

丸めを適切に処理する必要はありません。結果が少しずれていても心配しないでください。

テスト

プログラムをテストするには、このツールを使用して、10進数と浮動小数点の2進数を変換できます

1000 + 0.5 = 1000.5

01000100011110100000000000000000 + 00111111000000000000000000000000 = 01000100011110100010000000000000

float.MaxValue + float.MaxValue =無限大

01111111011111111111111111111111 + 01111111011111111111111111111111 = 01111111100000000000000000000000

321.123 + -123.321 = 197.802

01000011101000001000111110111110 + 11000010111101101010010001011010= 01000011010001011100110101010000

幸運を!

回答:


3

Python、224文字

このコードは、浮動小数点入力ff*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では5つの丸め規則が許可されているため、「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.