有没有办法以二进制形式序列化GMP有理数?我只看到读取/写入a的函数FILE,但即便如此,它也是一种文本形式.我可以转换为分子/分母并使用整数函数,但同样只有FILE输出可用.我需要能够获取原始字节或写入C++流.
使用mpz_exportandmpz_import函数(感谢 Marc 指出这一点),我想出了下面的代码。number这是包含值的类的一部分mpz_class。
这确实表明 GMP 没有适当的导入/导出功能。下面更多的是一种解决方法,而不是使用某个功能。
void number::write( std::ostream & out ) const {
int8_t neg = value.get_num() < 0;
out.write( (char*)&neg, sizeof(neg) );
size_t c;
void * raw = mpz_export( nullptr, &c, 1, 1, 0, 0, value.get_num().get_mpz_t() );
out.write( (char*)&c, sizeof(c) );
out.write( (char*)raw, c );
free(raw);
raw = mpz_export( nullptr, &c, 1, 1, 0, 0, value.get_den().get_mpz_t() );
out.write( (char*)&c, sizeof(c) );
out.write( (char*)raw, c );
free(raw);
}
void number::read( std::istream & in ) {
mpz_class num, den;
size_t s;
std::vector<uint8_t> v;
int8_t neg;
in.read( (char*)&neg, sizeof(neg) );
in.read( (char*)&s, sizeof(s) );
v.resize(s);
in.read( (char*)&v[0], s );
mpz_import( num.get_mpz_t(), s, 1, 1, 0, 0, &v[0] );
in.read( (char*)&s, sizeof(s) );
v.resize(s);
in.read( (char*)&v[0], s );
mpz_import( den.get_mpz_t(), s, 1, 1, 0, 0, &v[0] );
value = mpq_class(num) / mpq_class(den);
if( neg ) {
value = -value;
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1150 次 |
| 最近记录: |