非常に高い精度(約10^-10
)で数値を格納し、さらにそれらをパラメータ( create_bloomfilter ([yet to decide the type] falsePositivity, long expected_num_of_elem)
)で使用する必要があるプログラムを作成しています。
私が得ることができる最高の精度は、十分ではありませんdouble
。10^-6
cでより高い精度で数値を保存するにはどうすればよいですか?
非常に高い精度(約10^-10
)で数値を格納し、さらにそれらをパラメータ( create_bloomfilter ([yet to decide the type] falsePositivity, long expected_num_of_elem)
)で使用する必要があるプログラムを作成しています。
私が得ることができる最高の精度は、十分ではありませんdouble
。10^-6
cでより高い精度で数値を保存するにはどうすればよいですか?
について誤解されていますdouble
。
a に格納できる最小の正の数double
は約 2⨯10 -308であり、非正規化数はカウントされません。これはさらに小さくなる可能性があります。デノーマルは 5⨯10 -324まで下がります。それらは約 15 ~ 17 桁の精度に相当し、地球の直径を人体の最小細胞である赤血球のサイズ内で測定するのに十分です。
本当にもっと精度が必要な場合は、MPFR が必要です。(アルゴリズムが数値的に不安定な場合、MPFR は役に立たない可能性があります。)
編集:あなたが間違っていることを理解しました。
C では10^-7
、整数式です。ほとんどのシステムでは -13 に等しいはずです。この演算子は、指数演算子ではなく^
、ビットごとの XOR 演算子です。C の演算子は通常、少なくともハードウェアの実装に関しては、より原始的な操作に対応するため、C には累乗演算子はありません。
あなたがしたい1e-7
、またはpow(10, -7)
。
#include <stdio.h>
#include <math.h>
int main(int argc, char *argv[])
{
printf("2e-308 = %g\n", 2e-308);
printf("2 * pow(10, -308) = %g\n", 2 * pow(10, -308));
printf("10^-7 = %d\n", 10^-7);
return 0;
}
出力:
2e-308 = 2e-308 2 * pow(10, -308) = 2e-308 10^-7 = -13
浮動小数点数には多くの落とし穴があることに注意してください。
GNUMPFRライブラリとGNUGMPライブラリをお試しください
MPFRライブラリは、正しい丸めを使用した多倍長浮動小数点計算用のCライブラリです。
GMPは、任意精度の算術演算用の無料のライブラリであり、符号付き整数、有理数、および浮動小数点数を操作します。GMPが実行されているマシンで使用可能なメモリによって示される精度を除いて、精度に実際的な制限はありません。GMPには豊富な機能セットがあり、機能には通常のインターフェースがあります。
ロングダブルで十分ですか?一部の実装では、要件を簡単に処理できる 128 ビットの long double を使用します。
http://en.wikipedia.org/wiki/Quadruple_precision
非常に強力なものを探している場合は、MPFR をチェックしてください