2

を使用してフロートの CSV を出力していofstreamます。float の 99% は小数点以下 1 桁から 2 桁の精度であるためfileOut.precision(3)、正確な精度を強制するには単純に使用するだけで十分です。

時々、float の値が極端に低くなり、科学表記法 aka で出力されます1e-007。この場合、理想的には0.

ここでの多くの回答は、これを防ぐためにに似たものを使用することを提案していますfileOut.setf(std::ios::fixed, std::ios::floatfield);が、これにより、0.000桁数が必要かどうかに関係なく、すべてのフィールドが出力されます。

私が望むのは、すべてのフロートが正常に動作し、科学表記法を表示しないことです。

とにかくこれを行うにはありますか、それとも数値が下にあるかどうかをチェックする単純な関数を作成する必要があります0.001か?そうであれば、0に設定しますか?

アップデート:

現在、次のコードを使用してフロートをラップしていますが、理想的ではありませんが機能します。

float _RoundToZero(float in, int precision = 2)
{
  return in <= (1 / powf(10,precision)) ? 0.0 : in;
}
4

2 に答える 2

0

iostream 申し訳ありませんが、と で達成することは不可能printfです。唯一のオプションは次のとおりです。

  • 正しい丸めを行うために、独自の浮動小数点フォーマットルーチンを実装します。
  • フロートを文字列にフォーマットし、ゼロをトリミングします。
  • 値がしきい値未満の場合は、ゼロに丸めます。

最初のものは複雑で、最後のものは不正確です(バイナリフロートで正確に10 -nを表すことはできません)。

numputファセットをオーバーライドすることですべてを実装できます。これにより、フォーマットコードを以前と同じようにクリーンな状態に保つことができます。

最後のオプションの実装は次のとおりです。

#include <iostream>
#include <locale>
#include <math.h>
using namespace std;

class my_put : public std::num_put<char> {
    iter_type do_put (iter_type out, ios_base& str, char_type fill, double val) const
    {
        streamsize prec = str.precision();
        if((str.flags() & ios_base::floatfield) == ios_base::fixed && fabs(val)*2 <= pow(10.0, -(int)prec))
            str.precision(0);
        out = std::num_put<char>::do_put(out, str, fill, val);
        str.precision(prec);
        return out;
    }
};

int main()
{
    double a[] = {123, 0, 0.001, 0.0001 };
    cout.imbue(locale(cout.getloc(), new my_put));
    cout.precision(3);
    cout.setf(ios_base::fixed, ios_base::floatfield);
    for(int i = 0; i < 4; ++i)
        cout << a[i] << '\n';
}

ここの出力を参照してください:http://ideone.com/qaV0w

境界の場合(0.0005)の正確さは、下線を引く浮動小数点の形式と実装に依存することに注意してください。

于 2012-06-20T13:37:49.590 に答える
0

100 を掛けた値を整数として出力することを検討してください (正確にするために丸めます)。そうすれば、末尾にゼロが表示されることがありますが、小数点以下を出力する必要がなくなり、値ごとに 1 文字が無駄になります。

または、フロートをバイナリで記述します。すべての float は同じサイズ (4 バイト) になるため、末尾のゼロを気にせずに元の精度をすべて保持できます。ファイル サイズは非常に予測可能であり、値を区切るスペースを無駄にする必要はありません。100 個の値には 400 バイトかかります。テキスト形式では、値は最小で 2 バイト (数値 + フィールド区切り文字)、最大でフォーマットで許可されているもの (小数点の 1 つを含む) と区切り文字を足したものになります。その形式では、4 バイトで浮動小数点数の 5 または 6 ではなく、2 桁の有効数字が得られます。

于 2012-06-20T13:39:25.720 に答える