문제

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

도움이 되었습니까?

해결책

Floating Point Square 루트에 필요한 코드는 다음과 같습니다. 초기 입력 및 최종 출력이 동일하다는 것을 알 수 있습니다.

#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