キャストとして実現されます。LdoubleからLdoubleへのコピーで精度が落ちることはありません。Ldoubleは、64bit精度を保持していますので、Ldoubleを使った演算中は常に64bit精度を保ちます。丸められるわけではありません。この方法はとてもうまく問題を解決してくれるかもしれません。計算精度ボトムの一部だけをLdoubleによる高精度計算に置き換えて、その後キャストするだけで、今までの計算ルーチンに戻せます。しただけ(1文字修正)で問題が解決するかもしれません。自然に組み込めるのは良いのですが、コードを一見しただけだと変化(影響)がわかりにくいので、コメントは丁寧に書く必要があります。Build後にできたexeを実行すると次の結果が得られました。piを除いては、基本演算の確認です。左側がdouble演算による結果で、右側がLdouble(FPU)による結果です。piはライプニッツの公式によるπの計算ですが、わざと演算量を増やして、処理時間を比較しています。5,000,000項で打ち切って、演算結果と演算に要した時間を表示します。三角関数などを使うと、FPUの方が10倍くらい処理時間が掛ることもあります。bit多くの精度を出すため処理時間が掛かるようです。除算については、double演算とFPUで処理時間は同等でした。逆アセンブラを見てみると、double演算ではSSE2が使われていますが並列化までは行われていません。うまく並列化(最適化)できれば、double演算はもう少し早くなります。(Release-Buildではdouble演算側に多少のベクトル化が行われていました。)正確さと処理時間のトレードオフですので、どちらが良いというものではありません。目的に即した解決策が見つけられなければ、このような方法もありかと思います。上記、掲載ソースを圧縮したものをここに置いておきます。πの部分算出の記録では500兆桁を超えている。この部分算出の元になったのが、次の公式です。この式からd桁目を求めるために、16^dを乗じて、小数点以下を取りだすことを考える。ここでSを次のように定義する。(piqpr8.c)ここでは右向きバイナリ法を使って剰余(mod)を求めているが、剰余計算にモンゴメリ法を使うことを考える。高速なモンゴメリ法では、法は奇数であることが望ましい。S1,S5の法は、8k+1,8k+5であるので奇数であるが、S4,S6は偶数となるので、このままでは使えない整数論の定理の中に次のものがある。同様にS6の第一項は、これで法が奇数となり、高速なモンゴメリ法を使うことができる。プログラムは次のようになる。(defaultではπの100万桁(Hex)目を算出する。m=4,m=6の処理とexpm()→expmong()です。intel系x86コードでの64bit整数演算は早くないので、面白い結果が出ました。1.223[sec]【結果】およそ30%、モンゴメリ法が早いVC2010でBuildした限りでは、32bitではバイナリ法の方が早く、64bitではモンゴメリ法の方が早くなりました。部分的なコード変更だと、かえって成績が悪くなってしまいました。バイナリ法のコンパイラオプションでSSE2を有効にしてみてもあまり効果はなかったのですが、Intelコンパイラを使うと、もう少し早くなるかもしれません。型を__int64にすれば、1億桁まで計算できるようになります。x86(32bit)だと64bit整数演算が増えるとそれだけ処理が遅くなります。x64で1億桁の計算は、私のPCでは150秒ほどでした。拡張倍精度(仮数部64bit)と長整数(80bit程度)を組み合わせれば、このアルゴリズムでも100億桁ぐらいは行けると思いますが、これだけの計算量になると普通のPCでは難しいです。HTML5版ModifiedSimpson御坂黒岳の黒石SSLマルチサイトのテスト環境ベネッセ個人情報流出XPは終わりですか。