- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
任意精度库 GMP 和 MPFR 使用机器字大小整数的堆分配数组来存储构成高精度数字/尾数的肢体。
应该如何解释这个肢体数组以恢复任意精度整数?换句话说:对于 N 个肢体,每个肢体持有 B 位,我应该如何解释它们以恢复 N*B 位数字?
肢体大小真的会影响内存中的表示(见下文)吗?如果是这样,其背后的理由是什么?
我编写了一个小程序来查看表示的内部,但我对所看到的感到困惑。肢体似乎按最高有效数字顺序排序,而肢体本身则采用 native 最低有效数字格式。当使用 32 位字和固定为 128 位的精度表示 64 位字 0xAAAABBBBCCCCDDDD
时,我看到:
% c++ limbs.cpp -lgmp -lmpfr -o limbs && ./limbs
ccccdddd|aaaabbbb|00000000|00000000
00000000|00000000|ccccdddd|aaaabbbb
这似乎意味着内存中的表示不能作为位字符串读回以恢复任意精度数(例如,如果将其加载到支持的机器上的寄存器中) N*B 大小的单词)。此外,这似乎也表明肢体大小改变了表示形式,因此在不知道使用哪个肢体大小来序列化数字的情况下,我将无法反序列化数字。
这是我的测试程序(使用 32 位肢体和 __GMP_SHORT_LIMB
宏):
#define __GMP_SHORT_LIMB
#include <gmp.h>
#include <mpfr.h>
#include <iomanip>
#include <iostream>
constexpr int PRECISION = 128;
void PrintLimbs(mp_limb_t const *const limbs) {
std::cout << std::hex;
constexpr int NUM_LIMBS = PRECISION / (8 * sizeof(mp_limb_t));
for (int i = 0; i < NUM_LIMBS; ++i) {
std::cout << std::setfill('0') << std::setw(2 * sizeof(mp_limb_t)) << limbs[i];
if (i < NUM_LIMBS - 1) {
std::cout << "|";
}
}
std::cout << "\n";
}
int main() {
{ // GMP
mpz_t num;
mpz_init2(num, PRECISION);
mpz_set_ui(num, 0xAAAABBBBCCCCDDDD);
PrintLimbs(num->_mp_d);
mpz_clear(num);
}
{ // MPFR
mpfr_t num;
mpfr_init2(num, PRECISION);
mpfr_set_ui(num, 0xAAAABBBBCCCCDDDD, MPFR_RNDN);
PrintLimbs(num->_mpfr_d);
mpfr_clear(num);
}
return 0;
}
最佳答案
对于字节表示来说重要的三件事:
请注意,从最后两点来看,在同一台大端机器上,数组的字节表示将取决于肢体大小。
关于肢体阵列的大小,取决于类型。比如GMP的mpn层,完全由用户自己处理。
对于 MPFR,大小是根据 mpfr_t
对象的精度推导出来的;如果精度不是肢体位大小的倍数,则尾随位始终设置为 0。另请注意,可能会分配比实际使用的内存更多的内存,并且不得将其与数组的大小混淆;您可以忽略这个事实,因为未使用的数据始终位于实际的肢体数组之后。
编辑关于基本原理:操作肢体而不是字节是出于速度原因。然后我认为选择小端法来表示肢体数组有两个原因。首先,它使基本运算(加法、减法、乘法)更容易实现并且可能更快。其次,实现模 2^K 算术要好得多,特别是当 K 可能发生变化时。
关于gmp - GMP/MPFR 肢体应如何解释?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66031553/
我一定遗漏了一些明显的东西: library(Rmpfr) list.mpfr <- list(mpfr(10, 128), mpfr(20, 128)) # I'd like to turn th
我最近编写了一个程序来计算 pi 到指定位数。位数必须作为第一个命令行参数传递。 当使用大约 300 以下的数字值运行时,它工作得很好。但是,当使用较大的数字值运行时,它会崩溃并出现以下异常。 ../
#include #include #include #include #include #include mpf_t epi; int main(int argc, char * * a
任意精度库 GMP 和 MPFR 使用机器字大小整数的堆分配数组来存储构成高精度数字/尾数的肢体。 应该如何解释这个肢体数组以恢复任意精度整数?换句话说:对于 N 个肢体,每个肢体持有 B 位,我应该
我正在处理一个处理非常大整数的项目,并使用了 MPIR库,基于 GMPlib到目前为止的整个项目。 我现在需要一个 MPIR 不包含的对数函数。另一个图书馆,MPFR ,同样基于 GMPlib,确实有
任意精度库 GMP 和 MPFR 使用机器字大小整数的堆分配数组来存储构成高精度数字/尾数的肢体。 应该如何解释这个肢体数组以恢复任意精度整数?换句话说:对于 N 个肢体,每个肢体持有 B 位,我应该
考虑以下向量: > v1 [1] 0.000000e+00 0.000000e+00 1.110223e-16 4.440892e-15 3.266195e-08 2.531242e-07 1.0
我正在尝试将 MPFR 数字转换为字符串,然后再返回。我使用的代码是: int base = 10; int input = 25; mpfr_t number; mpfr_inits2(53, nu
我正在尝试使用 MPFR 在 C++ 中编写一个函数来计算多个值。我目前正在使用 mpfr 数组来存储这些值。不知道每次需要计算和存储多少个值。这是函数: void Calculator(mpfr_t
我想打印使用 MPFR 的计算结果到文件,但我不知道如何。 MPFR 用于进行高精度的浮点运算。要打印 mpfr_t 数字,您可以使用以下函数: size_t mpfr_out_str (FILE *
我想模拟各种 n 位二进制浮点格式,每个格式都有指定的 e_max 和 e_min,p 位精度。我希望这些格式能够模拟次正规数,忠实于 IEEE-754 标准。 自然地,我的搜索将我带到了 MPFR
我正在安装带有 mpc 0.8.2、mpfr 3.1.0 和 gmp 5.0.2 的 gcc 4.5.2。我已将每个 mpc、mpfr 和 gmp 目录复制到 gcc-4.5.2 目录中(删除版本标记
我在我的环境中安装了 gmp 和 mpfr。现在我可以成功 #include #include #include 现在,假设我用某个值初始化了一个 mpf_class: mpf_class x
我有一个简单的 c++ 程序,使用多精度库 MPFR 编写来尝试理解更大程序中的内存问题: int main() { int prec=65536, size=1, newsize=1; mp
我整理了一个基本的 C++ 代码,它从文本文件中读取两个矩阵到 C++ 中,并使用 Eigen库解决广义特征值问题。当使用数据类型 double 和 MatrixXd 时,这完美地工作并给了我预期的结
我试图在互联网上找到一个如何使用 mpfr::mpfr_fac_ui 的示例,但找不到,所以我决定在这里提问。 我有自己的迭代阶乘 boost::multiprecision::mpfr_float
刚刚成功地使用 MPFR C++ 编译了一个程序(第一次),我需要打印出一些相当大的数字,但它们只是以工程符号而不是整数的形式出现。据我所知,该库并未针对(任意)整数进行优化,因此可以将 float
我花了一整天的时间来设置 GCC http://cygwin.wikia.com/wiki/How_to_install_GCC_4.3.0 在 gcc make 步骤中,它告诉我无论出于何种原因它都
我正在尝试在 Mac OS 10.8.5 上使用 MATLAB R2013a 编译需要 mpfr C 库的 mex 文件。我希望它在没有单独安装 MPFR 的系统上运行,因此我尝试包含静态库: mex
我刚刚安装了 zkcm library在我的 kubuntu 机器上,我在编译 C++ 代码时遇到了问题。 我已经安装了 gmp 和 mpfr 库并检查它们是否工作;代码 mpfr_t m1, m2,
我是一名优秀的程序员,十分优秀!