2017-03-21 11 views
1

私は次のコードの断片と困惑している:浮動小数点逆バイナリ表現

int main() 
{ 
    std::cout << std::bitset<32>(10.0f) << std::endl; 
    std::cout << std::bitset<32>(-10.0f) << std::endl; 

    float x = 10.0f; 
    std::bitset<32> bsx(x); 
    float y = -10.0f; 
    std::bitset<32> bsy(y); 
    std::cout << bsx << std::endl; 
    std::cout << bsy << std::endl; 
} 

ちょうど秒1(はい、それだけで切り捨て最初のものです):私は「

int main() 
{ 
    std::cout << std::bitset<32>(10.0f) << std::endl; 
    std::cout << std::bitset<32>(-10.0f) << std::endl; 
} 

第二

00000000000000000000000000001010 
00000000000000000000000000000000 
00000000000000000000000000001010 
11111111111111111111111111110110 

: 第一1:メートル以下の出力を得る

00000000000000000000000000001010 
00000000000000010010000001101000 

システムはmacOS Sierra(10.12.3)でClang 4.0.0ですが、浮動小数点数はここでは32ビットです。 (g++ -pedantic -std=c++14でコンパイル。)

私は浮動小数点数のための承知している唯一のものは、IEEE-754、個別の符号ビットがなければならないと述べています。最初のプログラムの最後の出力は...ただでさえ切り捨て同じコード、と..すべてゼロとややランダム出力を2の補数...

そして、他のものがちょうど完全に混乱しているを使用しているように見える

私は何を誤解していますか?コードのどこかで未定義の動作が発生していますか?構文を理解していないのですか?何らかの理由で浮動小数点数をビットセットとして表現できないのですか?

+2

'std :: bitset'は浮動小数点を取るctorを持っていないので暗黙的に変換しています – harold

+1

' std :: bitset'のドキュメントを読んだことはありますか? –

答えて

1

このコードでは、浮動小数点数の2進表現は表示されません。浮動小数点数をとるstd::bitset constructorsが存在しないためです。

0

それはこのように動作します:

#include <bitset> 
#include <iostream> 
inline unsigned U(float f) { return (unsigned&) f; } 

int main() 
{ 
    std::cout << std::bitset<32>(U(10.0f)) << std::endl; 
    std::cout << std::bitset<32>(U(-10.0f)) << std::endl; 
    return 0; 
} 

私は別の形式で値を明示的に再読み込みを追加しました。 出力が

01000001001000000000000000000000 
11000001001000000000000000000000 

(もちろん、プラットフォーム固有の詳細については、伝統的な免責条項がここに置かなければならない。)

UPDATEです:少なくともコンバータの原因となるメモリエイリアシングに問題がある良く書き込まれます(以下の方法で近代的なGCCとクラン)のために:

​​

最近のコンパイラは「bitcast」オペレーターとしてこれのmemcpy()を治療し、内部で移動するレジスタの適切な種類に変換します。これがなければ、別名でいくつかの奇妙な問題に会うことができます。

inline unsigned U(float f) { 
    union { 
     unsigned u; 
     float f; 
    } t; 
    t.f = f; 
    return t.u; 
} 

異なる言語やバージョンのためのより良いですbitcastingのどのようなスタイルに矛盾した意見がありますが、私は彼らに飛び込むません。 しかし、このアプローチは、異なるタイプのメンバーの和集合を好むれ、ICCのためまだ悪いですここに。

+0

実装で定義された動作だけでなく、標準に従った明白な未定義の動作でも、符号なしの浮動小数点数を符号なしに変換しませんか? – ledonter

+0

@ledonter unsigned/signedはメモリチャンクの再解釈であるためここでは関係ありません。したがって、プラットフォーム固有の問題のみが重要です。 – Netch

関連する問題