2

私は一日中これに頭をぶつけています。私が現在取り組んでいる C++ プロジェクトには、編集可能な値を表示するという要件があります。現在選択されている桁には、その桁の上に増加した値と下に減少した値が表示されます。編集可能な値を数字と数字のコレクションの両方として参照できると便利です。インデックス可能な形式の浮動小数点数があれば素晴らしいことですが、そのような解決策を見つけることができませんでした。私はこの質問をそこに投げ出して、私が見逃している明らかなものがあるかどうか、または自分でロールバックする必要があるかどうかを確認しています.


アドバイスありがとう!float -> string -> int から変換されない解決策を望んでいましたが、浮動小数点の量子化の問題を回避するにはそれが最善の方法だと思います。私はboost::formatを使い、文字列の個々の文字を参照するだけになりました。modf と fmod の組み合わせを使用して float から数字を取得しようとする場合と比較して、パフォーマンスに大きな違いがあることはわかりません (おそらく、舞台裏でそれを行い、私の実装よりも確実に行うだけです)。

4

3 に答える 3

5

浮動小数点数の内部表現は、ご覧のとおりではありません。スターリングにのみキャストできます。

キャストするには、次のようにします。

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/Floating_point

于 2008-12-03T23:42:23.207 に答える
5

ああ、文字列に変換する方法はたくさんあります。(私自身は s n printf() の方が好きですが。)

または、int に変換し、モジュラスと整数除算を使用して数字を引き出すこともできます。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 と b の正確な値に応じて、それらは非常にわずかに異なる場合があります。約 10^-25 です。)

于 2008-12-04T08:21:01.180 に答える
0

boost::lexical_cast を使用してのみ、string と float の間でキャストできます。ただし、float 形式に直接インデックスを付けることはできません。内部的には 10 進数として格納されません。これはおそらくそれほど問題ではありません。UI の場合、getter/setter で float との間の変換を行って、数値の文字列形式を保持する可能性が最も高いでしょう。

于 2008-12-04T09:52:42.243 に答える