web-dev-qa-db-ja.com

Cのprintf()のフォーマット指定子%a

私はC言語の本を読んでいますが、%f, %e, %g, %afloatおよびdoubleデータ型に使用されるprintf文字であると書かれています。現在、私は%f, %e, %gを完全に理解できます。

floatおよびdoubleタイプのデータを印刷するには、いつ%aを使用する必要がありますか?

例を教えてください。

23
Nano HE

_%a_フォーマット指定子はC99の新機能です。浮動小数点数を16進形式で出力します。これは、ユーザーに数値を提示するために使用するものではありませんが、内部/技術的なユースケースには非常に便利です。

例として、このコードは次のとおりです。

_printf("pi=%a\n", 3.14);
_

プリント:

_pi=0x1.91eb86p+1
_

コメントにリンクされている優れた記事は、これは「1.91EB86」と読む必要があると説明しています16 * 21"(つまり、pは_power-of-two_用です。浮動小数点数はに上げられます)。この場合、 "1.91EB8616"は" 1.570000052452087410"。これに" 2を掛けます1」、「3.140000104904175」を取得します10"。

これには、すべてのビットの精度を維持し、それらを堅牢な方法で提示するという便利な特性もあることに注意してください。たとえば、これを使用して浮動小数点数をテキストとしてシリアル化でき、循環小数や無限小数について心配する必要はありません。

strtod() は、16進形式の浮動小数点数を実際の数に戻すことができることにも注意してください。 sscanf()とその仲間について100%確信が持てず、ドキュメントはあまり明確ではなく、私はそれを使ったことがありません。

42
unwind

16進表現を使用する理由の例としては、%aを使用して、処理のために別のマシンに送信される浮動小数点値を正確に表すことができます。

現在、これを組み込みコントローラーの単体テストに使用しており、センサーとアクチュエーターをエミュレートしているシミュレートされたプラントモデルから、組み込みプロセッサーが制御処理を行うUART)を介して組み込みプロセッサーにデータを送信します。そして、フィードバック(ここでも%aとして表されるfloat)をプラントモデルに返し、ループを閉じます。

7
Daniel