1

異種のドキュメントからテーブルを読み取るシステムを構築していますが、浮動小数点数(の列)を管理するための最良の方法を知りたいです。列を実数で表すことができる場合は、使用しますList<Double>(Javaを使用していますが、他の言語の経験があれば便利です)。また、テーブルをCSVファイルとしてシリアル化したいと思います。したがって、テーブルは次のようになります。

"material", "mass (g)", "volume (cm3)",
"iron", 7.8, 1.0,
"aluminium", 27.3, 9.9,

列2(1ベース)は、List<Double>

{new Double(7.8), new Double(27.3)} 

また、密度(質量/体積)を計算し、新しい列( "density(g.cml-3)")をリストとして導出したい場合もあります。

{new Double(7.8), new Double(2.76)} 

ただし、入力値が欠落している、異常である、またはファジー概念で表されている場合があります。一部の変換では例外がスローされる場合があります(これをキャッチして上記のいずれかに置き換えます)。例は次のとおりです。

1.0E+10000
>10
10 / 0.0 (i.e. divide by zero)
Math.sqrt(-1.)
Math.tan(Math.PI/2.0)

リスト要素の異常な値に対して、Javaで次のオプションがあります

  1. null参照
  2. Double.NaN
  3. Double.MAX_VALUE
  4. Double.POSITIVE_INFINITY

上記のJavaの異常な値を使用する必要がある場合のプロトコルはありますか?私は彼らがどのように振る舞うかについてこの質問を読みました。(私は彼らの操作の連鎖に依存したいと思います)。また、プロトコルがある場合、値をシリアル化して読み戻すことができますか?"0x7ff0000000000000L"(たとえば、Javaは次の値に等しい数に解析しますかDouble.POSITIVE_INFINITY

仕様の精度がいくらか失われることに備えています(OCRにエラーがある、数字が欠落しているなどの場合が多いため、これは「十分な」演習です)。

4

1 に答える 1

1

ある程度分離する必要がある3つの問題があります。

  1. テーブルエントリにはどのような表現を使用する必要がありますか?それは、数値、一部の単位の数量、またはその他のものである可能性がありますか?

  2. 浮動小数点無限大とNaNはどのように役立ちますか?

  3. 浮動小数点オブジェクトをシリアル化(ファイルに書き込んだり、ファイルから読み取ったり)するにはどうすればよいですか?

これらについて:

  1. ここでは、テーブルエントリを表す方法に関する適切なアドバイスを提供するための十分な情報を指定していません。あなたが説明していることから、浮動小数点を使用する理由はまったくありません。これは、エントリの読み取りと書き込み以外に、エントリに対して実行する操作を指定していないためです。算術演算を行う必要がない場合は、値を浮動小数点やその他の数値算術システムに変換する必要はありません。エントリを元のテキストとして維持するだけで済みます。これにより、シリアル化は簡単になります。

  2. 浮動小数点の無限大は、設計上、数学的な無限大のように機能します。無限大に無限大以外の数を加えたものは、無限大のままです。数学的な無限大を表すには、浮動小数点無限大を使用する必要があります。オーバーフローする値を失うことを気にしない限り、オーバーフローを表すために浮動小数点無限大を使用することは避けてください。浮動小数点NaNは、「数値ではない」ことを表すことを目的としています。「エラーが発生したため、ここに番号を記載していません。この場所で何か他のことをする必要があります。」次に、おそらく別のソースからの補足情報または並列データ構造を使用して、他の何かを提供するのはアプリケーション次第です。エラーには、負の数の平方根を取る、一部のデータの初期化に失敗するなどが含まれます。(例えば、

  3. 浮動小数点値を読み書きするときは、値を正確に変換するように注意する必要がありますまたは、変換で発生するエラーが許容できることを確認してください。「2進数」(任意の値のバイト)で書き込むのではなく、テキスト(人間が読める数値)に変換する必要がある場合は、浮動小数点のネイティブ基数と互換性のある数値ベースを使用する表記を使用する方が望ましい場合があります。ポイントシステム(たとえば、.8125の0x3.4p-2などの2進浮動小数点表現の16進浮動小数点数値)。これが不可能な場合は、浮動小数点値を読み取るときに元の値を復元するのに十分な精度で浮動小数点値を表すのに十分な桁数(10進数に変換する場合)を生成する必要があります。また、変換ソフトウェアが追加のエラーを発生させずに変換することを確認する必要があります。 。また、無限大やNaNなどの特別な値を処理する必要があります。

(これMath.tan(Math.PI/2)は無限大ではなく、正確にはπ/ 2ではないため、例外が発生しないことに注意してくださいMath.PI/2。したがって、その接線は無限大ではなく有限です。)

于 2013-02-26T16:17:46.650 に答える