0

最大 1000 億回の反復に対する数学的推測を検証する C++ プログラムを作成しています。このような大きな数値をテストするために、 a を使用できないためC++ intNTLライブラリを使用して、型ZZを数値型として使用しています。

私のアルゴリズムは次のようになります。

ZZ generateNthSeq(ZZ n)
{
    return floor(n*sqrt(2));
}

2 つのライブラリをインポートしています。

#include <cmath>
#include <NTL/ZZ.h>

しかし、明らかにエラーが発生するため、これはコンパイルできません。

$ g++ deepness*.cpp
deepness.cpp: In function ‘NTL::ZZ generateNthSeq(NTL::ZZ)’:
deepness.cpp:41: error: no matching function for call to ‘floor(NTL::ZZ)’
/usr/include/bits/mathcalls.h:185: note: candidates are: double floor(double)
/usr/lib/gcc/x86_64-redhat-linux/4.4.7/../../../../include/c++/4.4.7/cmath:262: note:                 long double std::floor(long double)
/usr/lib/gcc/x86_64-redhat-linux/4.4.7/../../../../include/c++/4.4.7/cmath:258: note:                 float std::floor(float)

床の数学演算が ZZ クラス タイプを受け入れることができないことを示します。しかし、私は数字がかなり大きくなる必要があります。NTL ライブラリを使用しながら、関数をフロアにすることである、やりたいことをどのように達成できますか?

4

1 に答える 1

4

floor整数型に適用することは実際には意味がないことに注意してください(まあ、そうです、それは何もしません)。本当に心配する必要があるのは、コードが明らかに何かの型ZZfloor!に渡しているという事実です。

つまり、n * sqrt(2)ここで何を意味するのでしょうか?

また、それを書く前に、ドキュメントをチェックして、整数 * 浮動小数点が実際にライブラリに存在するかどうかを確認しました-通常、それがまったく役立つためには、任意精度の浮動小数点型が利用可能である必要があります。


ヘッダーを確認すると、乗算演算子は 1 つだけです。

ZZ operator*(const ZZ& a, const ZZ& b);

変換コンストラクターがあります。

explicit ZZ(long a);  // promotion constructor

あなたのコードがどのようにコンパイルされているのかさえわかりません。おそらく、私が見ているものとは異なるバージョンのライブラリを使用しており、変換コンストラクターが暗黙的でありdoubleZZ. sqrt(2)a に昇格するZZと整数が得られるだけなので、これは確かにあなたが望むものではありません1

次のいずれかが必要です。

  • NTL に任意精度の浮動小数点機能があるかどうかを調べる
  • 任意精度の浮動小数点機能を備えたライブラリに切り替える
  • 計算を純粋な整数演算に変換します

最後の 1 つはここではかなり簡単です。

return SqrRoot(sqr(n) * 2); // sqr(n) will be a bit more efficient than `n * n`
于 2015-05-27T17:00:14.170 に答える