2016-04-17 11 views
1

符号、指数、仮数を使ってIEEE754浮動小数点数を作成しようとしていますが、コンピュータ上でldexp()関数が動作しないように見えるので、作成方法があるかどうか疑問に思っていましたビットの値を直接操作することにより、値表現をいじりためldexpを使用せずに浮動小数点数を作成する方法はありますか?

+3

おそらく、あなたはなぜそれを回避しようとするのではなく、 'ldexp'を使うことができないのかと尋ねるべきでしょう。あなたのコンピュータが非常に奇妙な場合を除き、ldexpの使用には問題ありません。 – rici

答えて

0

1つの標準っぽいイディオムはint又はcharアレイの一部としてビットで動作するようになり、その自分の意図したタイプにmemcpy()

unionの一つのフィールドを書き込み、別のものを読んでて、またはtype-punning(別のタイプからのポインタをキャストし、逆参照、char*以外)を介して、あなたが求めるものをやってすることは技術的にはC++標準の下で未定義の動作であることに注意してください、したがって避けるべきです。コンパイラは、プログラムがこれらの動作を実行せず、予期せぬ動作につながるという前提に基づいて最適化を適用することが知られています。

ここで考えるポインタキャストの正確な例については、Clang/LLVMの開発者はa blog postに予期しない方法で最適化する可能性のある未定義の動作を公開しています。

+1

ビットを浮動小数点オブジェクトにコピーすると、これはコンパイラで動作することがわかります。私。あなたはコンパイラを知っています。コンパイラがタイプ・ペニングをサポートしていない場合を除き、コンパイラがわかっているときにそれを使用しない理由はありません。基本的な言語機能のサポートの欠如*を回避するためのコンパイラを使用しないでください。 –

+2

最後に書き込まれたものとは異なる型への型付けと共用のアクセスがあります*未定義の動作* - 言語は文字通り何かを行うコンパイラを招待します。このトピックの詳細な調査については、http://blog.regehr.org/archives/959とその他のRegehr教授のブログを参照してください。 – Novelocrat

+1

@ Cheersandhth.-Alf型のパニング(特定の型の中で)と共用体エイリアシングは、Standard C++ –

関連する問題