フロートから個々の数字を抽出する
-
19-08-2019 - |
質問
私は一日中、これに頭を打ちました。現在作業しているC ++プロジェクトには、編集可能な値を表示する必要があります。現在選択されている数字は、その数字に対して上に増加した値と下に減少した値を表示します。編集可能な値を数字と数字のコレクションの両方として参照できると便利です。浮動小数点数のインデックス可能な形式があれば素晴らしいのですが、そのような解決策を見つけることができませんでした。私はこの質問をそこに投げ出して、私が行方不明になっている明らかなものがあるかどうか、または自分で転がす必要があるかどうかを確認します。
アドバイスをありがとう! floatから変換しないソリューションを期待していました-<!> gt;文字列-<!> gt; intですが、私は浮動小数点の量子化の問題から逃れるための最良の方法であると考えます 。最終的にboost :: formatを使用し、文字列の個々の文字を参照するだけになりました。 modfとfmodの組み合わせを使用してフロートから数字を取得しようとする場合と比べて、パフォーマンスが大きく異なることはわかりません(おそらく、舞台裏でそれを行うだけで、実装よりも堅牢です)。
解決
浮動小数点数の内部表現は、あなたが見たようなものではありません。スターリングにのみキャストできます。
キャストするには、次の操作を行います。
char string[99];
sprintf(string,"%f",floatValue);
またはこちらをご覧ください: http:// www.parashift.com/c++-faq-lite/misc-technical-issues.html#faq-39.1
ウィキペディアの記事では、表現の詳細を説明できます: http://en.wikipedia.org/wiki/浮動小数点
他のヒント
ああ、文字列に変換する方法はたくさんあります。(私はs n printf()を好みますが)
または、整数に変換し、モジュラスと整数除算で数字を引き出すこともできます。 log {base10}で桁数をカウントできます。
(覚えておいてください:log {baseA} _X / log {baseA} _B = log {baseB} _X。)
例:
#define SHOW(X) cout << # X " = " << (X) << endl
int
main()
{
double d = 1234.567;
SHOW( (int(d)%10000) / 1000 );
SHOW( (int(d)%1000) / 100 );
SHOW( (int(d)%100) / 10 );
SHOW( (int(d)%10) );
SHOW( (int(d*10) % 10) );
SHOW( (int(d*100) % 10) );
SHOW( (int(d*1000)% 10) );
SHOW( log(d)/log(10) );
}
static_castを使用する必要がありますが...
指数表記に注意してください。非常に大きな数値または非常に小さな数値を使用すると、問題が発生する可能性があります。
浮動小数点数には、いくつかの悲嘆を引き起こす可能性のある丸めの問題もあります。 (これは、2つのdoubleの間にoperator ==を使用しないのと同じ理由です。または、a * b == b * aに依存できない理由です。a<!> amp; bの正確な値に応じて、 10 ^ -25前後でわずかに異なる場合があります。)
boost :: lexical_castを使用することによってのみ、文字列とフロートの間でキャストできます。ただし、フロート形式に直接インデックスを付けることはできません。内部的には10進数として保存されません。これはおそらくそれほど問題ではありません。 UIの場合は、とにかくgetter / setterでfloatとの間の変換を行い、文字列形式の数値を保持する可能性が高くなります。