4

ParaView で処理/可視化する C++ プログラムからのデータを印刷していますが、浮動小数点数に問題があります。Paraview は Float32 と Float64 の両方のデータ型をサポートしています。Float64 は、典型的な制限 +/-1.7e +/- 308 の double と同等です。しかし、私のコードは 6.5e-318 のような数値を出力しています。これは、データの読み取り時に ParaView でエラーをスローしています。これらの小さい数値をゼロに丸めると、ParaView のエラーが消えることを確認しました。なぜこのような「高精度」出力が得られるのかはわかりません。おそらく、一部の数値が double よりも高い精度で格納されているためです。たとえば、次のコードは私のシステムで同じ動作を再現します。

#include <iostream>
int main(void)
{
  const double var1 = 1.0e-318, var2 = 1.5e-318;
  std::cout << 1.0e-318 << std::endl; 
  std::cout << var1 << std::endl; 
  std::cout << var1 - var2 << std::endl; 
  std::cout.setf(std::ios_base::fixed | std::ios_base::scientific, std::ios_base::floatfield);
  std::cout << 1.0e-318 << std::endl; 
  std::cout << var1 << std::endl; 
  std::cout << var1 - var2 << std::endl; 

  return 0;
}

私の出力は次のとおりです。

9.99999e-319
9.99999e-319
-4.99999e-319
9.99999e-319
9.99999e-319
-4.99999e-319

私のシステムは Mac OS X Snow Leopard で、上記を GCC 4.2 と GCC 4.6 でフラグ-m32, -m64and -ffloat-store(これが役立つかどうかはわかりません) でテストしました。

実際、私にとっての出力は問題ありませんが、ParaView の場合はそうではありません。なぜこの違いがあるのか​​ 知りたいだけです。重要な可能性のある浮動小数点数に関連するものを無視している可能性が非常に高いです。double のこの出力/数値動作についての手がかりを教えてください。

4

1 に答える 1

11

非正規数、つまり、可能な限り小さい指数と分数の先行ゼロを持つ数値は、1E-308 よりも小さく、1E-324 まで小さくすることができます。おそらく、std::numeric_limits を使用してそれらを除外できます。

于 2011-09-30T14:17:35.557 に答える