2010-12-05 15 views
3

私は組み込みアプリケーションを開発中で、浮動小数点値を出力する必要があります。スペースや他の制限のため、私は出力のためにputchar()を使用することしかできません。putcharを使用して浮動小数点値を印刷する方法は?

パラメータとしてfloatをとり、putchar()を使用して出力する関数を作成しようとしています。私は整数値のために働く同様の機能を持っています。

void putLong(long x) 
{ 
    if(x < 0) 
    { 
     putchar('-'); 
     x = -x; 
    } 
    if (x >= 10) 
    { 
     putLong(x/10); 
    } 
    putchar(x % 10+'0'); 
} 

私は浮動小数点のための同様の機能を作ることができますか?

+2

浮動小数点が組み込みシステムのIEEE 754規格に準拠しているのか、それとも何か他の方法で表現されているのかどうか知りませんか? –

答えて

0

私の主なアプローチは、浮動小数値の整数部分を小数部分から分離することだと思います。

何らかの丸めや整数関数への変換を使用できる場合は、すでに持っているputLongメソッドを使用して整数部分を出力できます。

小数点を出力します。

次に、floatからそのintを減算して小数点を切り離します。今、10進数の場合は、小数点以下の桁数を決定するか、任意に大きな10の累乗を掛けて、結果のintの右側から無関係な0を取り除き、putLongを再度適用することができます結果のために。

これを行うには、より効率的で簡単な方法があると思われますが、このアプローチが有効であることは間違いありません。浮動小数点数のビットが指数部と値の構成要素を表すために使用される方法を調べることも有効です。

+0

これが「機能する」度合いは、要件によって大きく異なります。整数型が格納できる最大値より大きい値に対しては、まったく動作しません。 –

+0

@R:これは本当ですが、余分なメモリ操作や大きなデータ型の使用が必要な場合でも、値の前後の部分を区切るという基本的な考え方は有効でしょうか? – DGH

+0

おそらく、小数点の位置を別の変数に格納しておくこともできます。それは本当にあなたがどのようなアプローチを採用しているかによって異なります。 –

1

どのような範囲の精度と精度が必要ですか?浮動小数点数の正確な値を10進数で表示することは非常に難しい問題です。作業スペースが最大8 KB程度必要です。 80ビットまたは128ビットのlong doubleの値をサポートします。 doubleしかサポートしていない場合は、おそらく1kb程度かかりますが、劣悪な近似値を印刷したい場合は基本的に作業スペースがありません。

void putDouble(double x, int p) 
{ 
    long d; 
    if (x<0) { 
     putchar('-'); 
     x=-x; 
    } 
    d = x; 
    putLong(d); 
    putchar('.'); 
    while (p--) { 
     x = (x - d) * 10; 
     d = x; 
     putchar('0'+d); 
    } 
} 

あなたは2桁より長い数字を処理するために、あなたのputLong修正したい場合があり、2 :-)ここ

+0

現在、私は数字の整数部分だけを表示しているので、小数点は改善されます。 – CodeFusionMobile

2

が可能な解決策があります:

OKので、ここでは本当に基本的なバージョンだ

typedef enum 
{ 
    DEC1 = 10, 
    DEC2 = 100, 
    DEC3 = 1000, 
    DEC4 = 10000, 
    DEC5 = 100000, 
    DEC6 = 1000000, 

} tPrecision ; 

void putFloat(float f, tPrecision p) 
{ 
    long i = (long)f ; 
    putLong(i) ; 
    f = (f - i) * p ; 
    i = abs((long)f) ; 
    if(fabs(f) - i >= 0.5f) 
    { 
     i++ ; 
    } 
    putchar('.') ; 
    putLong(i) ; 
    putchar('\n') ; 
} 

あなたはこのようにそれを使用します。

putFloat(3.14159f, DEC3) ; 

"3.142"と出力され、3桁目の切り上げに注意してください。

小数点以下の桁数が固定されている場合は、精度引き数を取り除いてハードコードすることができます。この機能を使用する場合

あなたはフロートのみ6 桁精度の、ない6 小数点以下の桁持っていることを認識する必要があります。したがって、DEC4を使用して123.456と言って印刷しようとすると、3位の後に誤った桁が表示されます。 6桁目以降の数字は無視する必要がありますが、それを考慮するコードを記述することはアプリケーションでは不要であるか、制約が与えられたほうが高価かもしれません。

関連する問題