2016-10-31 9 views
0

代わりのIEEE浮動小数点加算

float a = 32.342 , b = 193.132 
float total = a + b 

どのように私は32ビットに変換し、明示的に32ビットを使用して追加することができますか?

+1

'float'はすでに** 32ビット**浮動小数点値です。実際に何をしたいですか? –

+0

これらの32ビットを( 'byte [] array'として)取得したい場合は: 'byte [] array = BitConverter.GetBytes(a);' –

+0

@ DmitryBychenko申し訳ありませんが残念です。私はそれらのバイト配列を要求していました、どのように追加を実行できますか? –

答えて

0

私は(あなたが両方floatbyteに配列これらの配列を一緒を合計その後、変換したい)右のあなたを理解していれば、あなたはこのような何かを実装することができますのは、すべてのこれらのビットを見てみましょう(

// Initial floats 
    float a = 32.342f, b = 193.132f; // do not forget "f" suffix 
    float total = a + b; 

    // floats as byte[4] arrays 
    byte[] aArray = BitConverter.GetBytes(a); 
    byte[] bArray = BitConverter.GetBytes(b); 
    // let's compare actual float addition with arrays summation 
    byte[] totalArray = BitConverter.GetBytes(total); 

    // Add arrays directly: we may want to convert them into Int32, 
    // add up them up and, finally, convert back to array 
    // Reverse().ToArray(): we should take Ending into account 
    int c = unchecked(BitConverter.ToInt32(aArray.Reverse().ToArray(), 0) + 
        BitConverter.ToInt32(bArray.Reverse().ToArray(), 0)); 
    byte[] cArray = BitConverter.GetBytes(c).Reverse().ToArray(); 

可視化):

private static String ToReport(byte[] data) { 
    return String.Join(" ", data.Select(x => Convert.ToString(x, 2).PadLeft(8, '0'))); 
    } 

    ... 

    String text = String.Join(Environment.NewLine, 
    $"a:  {a,7} {ToReport(aArray)}", 
    $"b:  {b,7} {ToReport(bArray)}", 
    $"a + b:   {ToReport(cArray)}", 
    $"total: {total,7} {ToReport(totalArray)}"); 

    Console.Write(text); 

結果:

a:  32.342 00110101 01011110 00000001 01000010 
    b:  193.132 11001011 00100001 01000001 01000011 
    a + b:   00000000 01111111 01000010 10000101 // array + array 
    total: 225.474 01011000 01111001 01100001 01000011 // float + float