GMP中如何输出一个mpf_class类型

源代码如下,非常简单:


#include<iostream>

#include<fstream>

#include<gmp.h>

#include <gmpxx.h>

#include <string>

#include <stdio.h>

using namespace std;


int main() 

{

mp_bitcnt_t prec = 512;

mpf_class x(1.2000001000000000002,prec);

cout << "x的值:" << x << endl;

}


报错信息:无法解析的外部符号



可这种操作明明是官方文档上的示例,为什么会出现这种问题呢?


https://gmplib.org/list-archives/gmp-discuss/2007-July/002796.html
GMP的官方文件可能对微软VS支持的不太友好..

那没有什么解决方法吗?那这个mpf_class类型岂不是很鸡肋?连最简单的输出都不行

用gmp_printf吧 c++的cout写法可能已经不适合gmp了.但文档没有维护...

gmp_printf("x的值:%35.30Ff\n", x);也不行

能说一下gmp_printf怎么输出mpf_class类型的高精度浮点数吗?

https://gmplib.org/manual/C_002b_002b-Interface-Floats.html

Construct an mpf_class. Any standard C++ type can be used, except long long and long double, and any of the GMP C++ classes can be used.
string mpf_class::get_str (mp_exp_t& exp, int base = 10, size_t digits = 0)
似乎用这个可以打印输出...str形式的

这个好像打出的浮点数没有小数点

我之前试过

是我用的不对吗?能帮我写个简单的例子吗?

哇 想输出简单的1.123就这么难吗?

那你写个策略不就行了吗....我服了...
他都给你计算好了,小数点在哪里... 你printf()一下不就行了 
你把小数点 插入那个string..然后输出打印不行了吗

能给个示范吗?新手实在不太会

// gmp我没环境
#include <iostream>
#include <string>
#include <gmpxx.h>
int main()
{
    double a = 1.125; // 1.234 cannot be stored in a double exactly, try "1.234"
    mpf_class f(a);
    mp_exp_t exp;
    std::string significand = f.get_str(exp);
    std::cout << "significand = " << significand
              << " exponent = " << exp-(int)significand.size() << '\n';
    
    std::string a = "1234";
	a.insert(2, ".");
	std::cout << a;

}
gmp 我没环境, string 可以这样直接插入小数点..你自己改改吧..

#include<iostream>

#include<fstream>

#include<gmp.h>

#include <gmpxx.h>

#include <string>

#include <stdio.h>

using namespace std;


int main() 

{

mp_bitcnt_t prec = 512;

mpf_class x(1.2000001000000000002 ,prec);


mp_exp_t exp;

string significand = x.get_str(exp);


cout << "exp的值:" << exp << endl;

cout << "significand的值:" << significand << endl;


significand.insert(exp, ".");

cout << "significand的值:" << significand << endl;

}


得到的结果竟然是乱码

大哥,你没指定位数...

getstr有位数限制的

看文档,string类都不会玩...你就玩框架..

只是个作业,碰到精度不足的问题

c++确实不太熟,非计算机专业的

#include<iostream>

#include<fstream>

#include<gmp.h>

#include <gmpxx.h>

#include <string>

#include <stdio.h>

using namespace std;


int main() 

{

mp_bitcnt_t prec = 512;

mpf_class x(1.2000001000000000002 ,prec);


mp_exp_t exp;

size_t n_digits=30;

string significand = x.get_str(exp,10,n_digits);


cout << "exp的值:" << exp << endl;

cout << "significand的值:" << significand << endl;


significand.insert(exp, ".");

cout << "significand的值:" << significand << endl;

}


结贴给分233

什么意思?

还有问题吗2333.没问题就结贴给分...点采纳

还是不行啊?没有正确输出

你位数没给对,给了30位..

你小数部分只有17位

每次都得数一下有效数字吗?不能自动获取什么的吗?

你查一下第一次的significand.size()... 可以直接打出来 字符串的长度..
好像不对,你还是得去指定小数的精确位数.. 不然科学计数没有意义

可是这个精确位数有时候不太容易知道

没有精确位数的科学计数有什么意义.

比如我计算产生了一个mpf_class,我不知道它的有效数字位数,有可能比30位少,比如计算产生了1.123,也有可能比30位多,比如1.23333333333333333333333333333333333333333,对于后面这种我到30位截至没问题,但是前面这种,我总不能输出一个乱码出来吧,哪怕用零填充也好呀

就是如果我设置的精度比它的有效数字位数多,不能输出乱码

那就别转 string了...
#include<gmpxx.h>
using namespace std;
int main()
{
    mpz_t a, b, c, d;
    mpz_init(a);
    mpz_init(b);
    mpz_init(c);
    mpz_init(d);
    //计算2的1000次方
    mpz_init_set_ui(a, 2);
    mpz_pow_ui(c, a, 1000);
    gmp_printf("c = %Zd\n", c);
    
    //计算12345678900987654321*98765432100123456789
    mpz_init_set_str(b, "12345678900987654321", 10);//10进制 
    mpz_init_set_str(c, "98765432100123456789", 10);
    mpz_mul(d, b, c);
    gmp_printf("d = %Zd\n", d);
    mpz_clear(a);
    mpz_clear(b);
    mpz_clear(c);
    mpz_clear(d);
    return 0;
}
用官方打印办法 gmp_printf

也就是不能用c++,只能用c?

不是啊...用官方的方法...不是转string..会乱码吗

但是我的类型都是mpf_class类型的

从mpf_class转化成mpf_t吗?

  mpf_class::get_mpf_t() 对的

  mp_bitcnt_t prec = 1512;

mpf_class x(1.200000100000000000000012345645645454545454544540000000002 ,prec);

cout << "x的值:" << x.get_mpf_t() << endl;

你的意思是这样?

这样会产生无法解析的外部符号的报错

gmp_printf("f = %Fd\n", x.get_mpf_t());
你怎么就不会变通呢

这个我试过,也不行

那你自己看文档吧..我不奉陪了.

mp_bitcnt_t prec = 1512;

mpf_class x(1.200000100000000000000012345645645454545454544540000000002 ,prec);

gmp_printf("x = %30.25Ff\n", x.get_mpf_t());


说了要指定位数,我就不指定..那你自己玩.