質問

210桁の数値の平方根を正確に取得する必要がありますが、GMPは仕事に適したツールだと思いました。何が間違っていますか?

#include <stdlib.h>
#include <stdio.h>
#include "gmp.h"

int
main (int argc, char *argv[])
{
  mpz_t sq_me, sq_out, test;
  mpz_init(sq_me);
  mpz_init(sq_out);
  mpz_init(test);
  mpz_set_str (sq_me, argv[1], 10);

  mpz_sqrt(sq_out, sq_me);
  mpz_mul(test,sq_out,sq_out);

  gmp_printf ("%Zd\n\n", sq_out);
  gmp_printf ("%Zd\n\n", test);

  return 0;
}

入力:

  

24524664490027821197651766357308801846702678767833275974341445171506160083003858   72169522083993320715491036268271916798640797767232430056005920356312465612184658   17904100131859299619933817012149335034875870551067

出力:

  

49522383313031109809242226159886283348695660460381271324714928680654813093947239   9634016783775955618921028

     

24524664490027821197651766357308801846702678767833275974341445171506160083003858   72169522083993320715491034366358025027526868495267716284867043049443779615862887   47102011391915422793532619329760963626718900576784

役に立ちましたか?

解決

浮動小数点平方根に必要なコードは次のとおりです。初期入力と最終出力が同一であることがわかります。

#include <stdlib.h>
#include <stdio.h>
#include "gmp.h"

int main (int argc, char *argv[]) {
    mpf_t sq_me, sq_out, test;
    mpf_set_default_prec (10000);
    mpf_init(sq_me);
    mpf_init(sq_out);
    mpf_init(test);
    mpf_set_str (sq_me, argv[1], 10);

    mpf_sqrt(sq_out, sq_me);
    mpf_mul(test,sq_out,sq_out);

    gmp_printf ("Input:       %Ff\n\n", sq_me);
    gmp_printf ("Square root: %.200Ff\n\n", sq_out);
    gmp_printf ("Re-squared:  %Ff\n\n", test);

    return 0;
}

パラメータを使用した出力は次のとおりです。

Input:       2452466449002782119765176635730880184670267876783327597434144
51715061600830038587216952208399332071549103626827191679864079776723243005
60059203563124656121846581790410013185929961993381701214933503487587055106
7.000000

Square root: 4952238331303110980924222615988628334869566046038127132471492
86806548130939472399634016783775955618921028.19202568258368255653837168412
92356432661548614332014106174638951390596672950394981098992388116308833260
04535647648563996144250924277757344248059826024201642748515325655438898558
17807282091590722890002

Re-squared:  2452466449002782119765176635730880184670267876783327597434144
51715061600830038587216952208399332071549103626827191679864079776723243005
60059203563124656121846581790410013185929961993381701214933503487587055106
7.000000

他のヒント

結果を整数として取得し、それを二乗します。入力数値は完全な正方形であってはなりません。そのため、小数点以下が切り捨てられ、数値の精度が低下します。整数の 'mpz'ではなく、浮動小数点の関数の 'mpf'カテゴリを調べます。

libgmp-3.dllを使用しています

vb.netでは、この関数を高精度の平方根用に作成しました。完全にはテストしていませんが、必要な精度で3の平方根を取得できます

 Public Shared Function SquareRoot(ByVal Value As BigInt, ByVal Precision As Integer) As String
    Dim Ten As New BigInt(10)
    Dim DecLen As Integer = Value.Sqrt.ToString.Length
    Dim RootDigits As String = (Value * Ten.Power(Precision * 2)).Sqrt

    'Add trailing zeros
    RootDigits = RootDigits.PadRight((DecLen + Precision), "0")
    Return RootDigits.Substring(0, DecLen) & "." & RootDigits.Substring(DecLen)
End Function
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top