最近はC++で高精度な数値計算をやっています。gmp (gnu 多倍精度) フォーク mpir (多倍精度整数と有理数) を使用して 2 の平方根を計算するプログラムを作成しています。Win32 モードでプログラム (1 ファイル、約 100 行) をコンパイルすると、コンパイルして正常に実行されますが、x86 モードでオーバーフローが発生し始めたとき、より高い精度の計算を期待して x64 に切り替えてみました。コンパイルしようとすると、「関数 wmain で未解決の外部シンボル __gmpf_get_str が検出されました」など、8 つの非常によく似たリンカ エラーが発生しました。msdn やスタック オーバーフローなどの場所を検索して検索しましたが、何時間も費やしたにもかかわらず、そのような運はありませんでした。コードは次のとおりです。
// SquareRootFast.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include<sstream>
#include<malloc.h>
#include<cstdlib>
#include<mpir.h>
#include<fstream>
#include<iostream>
#include"mpir.cpp"
using namespace std;
char* __cdecl getstr(mpf_t mpf, size_t digits)
{
char* u1 = (char*)malloc(sizeof(char) * 5 * digits);
mp_exp_t* u2 = (mp_exp_t*)malloc(sizeof(long));
char* alpha = __gmpf_get_str(u1, u2, 10, digits, mpf);
return alpha;
}
int _tmain(int argc, _TCHAR* argv[])
{
unsigned long precspec = 1024 * 1024 * 256;
mpf_set_default_prec(precspec);
mpf_t sqrt;
mpf_init(sqrt);
mpf_set_d(sqrt, 1);
mpf_t one;
mpf_init(one);
mpf_set_d(one, 1);
mpf_t two;
mpf_init(two);
mpf_set_d(two, 2);
long long int count = 0;
while(count < 28)
{
mpf_t parta;
mpf_init_set_ui(parta, 0);
mpf_t partb;
mpf_init_set_ui(partb, 0);
mpf_div(parta, sqrt, two);
printf("Part A complete\n");
mpf_div(partb, one, sqrt);
printf("Part B complete\n");
mpf_add(sqrt, parta, partb);
printf(getstr(sqrt, 1000));
printf("\n");
count++;
printf("%d\n", count);
}
ofstream writer;
writer.open("C:\\Users\\Ben-4\\sqrt2(3).txt");
writer << getstr(sqrt, 1000000000);
writer.close();
}