C 用GMP求bignum的平方根

C 用GMP求bignum的平方根,c,bignum,gmp,C,Bignum,Gmp,我需要准确地得到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 (s

我需要准确地得到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;
}
#包括
#包括
#包括“gmp.h”
int
main(int argc,char*argv[])
{
mpz_t sq_me,sq_out,test;
mpz_init(sq_me);
mpz_init(sq_out);
mpz_初始(测试);
mpz_set_str(sq_me,argv[1],10);
mpz_sqrt(sq_out,sq_me);
mpz_mul(测试、sq_输出、sq_输出);
gmp_printf(“%Zd\n\n”,sq_out);
gmp_printf(“%Zd\n\n”,测试);
返回0;
}
输入: 245246644490027821197651766357308801846702678767833275974341445171506160083003858 72169522083993320715491036268271916798640797767232430056005920356312465612184658 17904100131859299619933817012149335034875870551067

输出: 4952238331303109809242261598862833486956604603812713247149286880654813093947239 96340160673775955618921028

245246644490027821197651766357308801846702678767833275974341445171506160083003858 72169522083993320715491034366358025027526868495267716284867043049443779615862887 47102011391915422793532619329760963626718900576784


得到的结果是一个整数,然后将其平方。输入的数字不能是一个完美的正方形,因此它会截断小数并降低数字的精度。查看浮点函数的“mpf”类别,而不是整数的“mpz”。

这是浮点平方根所需的代码,您可以看到初始输入和最终输出是相同的

#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;
}

我正在使用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

“输入的数字不能是一个完美的正方形”-最后一个数字是“7”,所有。。。
 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