源代码如下,非常简单:
#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());
说了要指定位数,我就不指定..那你自己玩.