gpt4 book ai didi

c++ - 具有 MPFR 的不同精度的次正规数

转载 作者:搜寻专家 更新时间:2023-10-31 02:15:18 29 4
gpt4 key购买 nike

我想模拟各种 n 位二进制浮点格式,每个格式都有指定的 e_maxe_minp 位精度。我希望这些格式能够模拟次正规数,忠实于 IEEE-754 标准。

自然地,我的搜索将我带到了 MPFR 库,它符合 IEEE-754 标准并且能够通过 mpfr_subnormalize() 函数支持次正规。但是,我在使用 mpfr_set_emin()mpfr_set_emax() 正确设置次正规环境时遇到了一些困惑。我将使用 IEEE double 作为示例格式,因为这是 MPFR 手册中使用的示例:

http://mpfr.loria.fr/mpfr-current/mpfr.html#index-mpfr_005fsubnormalize

mpfr_set_default_prec (53);
mpfr_set_emin (-1073); mpfr_set_emax (1024);

以上代码来自上述链接中的 MPFR 手册 - 请注意,e_maxe_min 都不等于 double 的预期值>。此处,p 设置为 53,正如 double 类型所预期的那样,但 e_max 设置为 1024,而不是正确的值 1023 , e_min 设置为 -1073;远低于 -1022 的正确值。我知道将指数边界设置得太紧会导致 MPFR 中间计算中的上溢/下溢,但我发现准确设置 e_min 对于确保正确的次正规数至关重要;太高或太低会导致次正规 MPFR 结果(使用 mprf_subnormalize() 更新)与相应的 double 结果不同。

我的问题是应该如何决定将哪些值传递给 mpfr_set_emax() 和(尤其是)mpfr_set_emin(),以保证 float 的正确次正规行为具有指数界限 e_maxe_min 的点格式?似乎没有关于此事的任何详细文档或讨论。

非常感谢,

詹姆斯。

编辑 2016 年 7 月 30 日:这是一个小程序,演示了为单精度数选择 e_maxe_min

#include <iostream>
#include <cmath>
#include <float.h>
#include <mpfr.h>

using namespace std;

int main (int argc, char *argv[]) {
cout.precision(120);

// IEEE-754 float emin and emax values don't work at all
//mpfr_set_emin (-126);
//mpfr_set_emax (127);

// Not quite
//mpfr_set_emin (-147);
//mpfr_set_emax (128);

// Not quite
//mpfr_set_emin (-149);
//mpfr_set_emax (128);

// These float emin and emax values work in subnormal range
mpfr_set_emin (-148);
mpfr_set_emax (128);

cout << "emin: " << mpfr_get_emin() << " emax: " << mpfr_get_emax() << endl;

float f = FLT_MIN;
for (int i = 0; i < 3; i++) f = nextafterf(f, INFINITY);

mpfr_t m;
mpfr_init2 (m, 24);
mpfr_set_flt (m, f, MPFR_RNDN);

for (int i = 0; i < 6; i++) {
f = nextafterf(f, 0);
mpfr_nextbelow(m);
cout << i << ": float: " << f << endl;
//cout << i << ": mpfr: " << mpfr_get_flt (m, MPFR_RNDN) << endl;
mpfr_subnormalize (m, 1, MPFR_RNDN);
cout << i << ": mpfr: " << mpfr_get_flt (m, MPFR_RNDN) << endl;
}

mpfr_clear (m);
return 0;
}

最佳答案

我正在复制我在 ResearchGate 上给出的答案(带有指向 mpfr_subnormalize 文档的链接):

有不同的约定来表示有效数字和相关指数。 IEEE 754 选择考虑 1 和 2 之间的有效数,而 MPFR(与 C 语言一样,例如参见 DBL_MAX_EXP)选择考虑 1/2 和 1 之间的有效数(出于与多精度相关的实际原因) .例如,数字 17 在 IEEE 754 中表示为 1.0001·24,在 MPFR 中表示为 0.10001·25。如您所见,这意味着与 IEEE 754 相比,MPFR 中的指数增加了 1,因此对于 double ,emax = 1024 而不是 1023。

关于选择 double 的 emin,需要能够表示 2−1074 = 0.1·2−1073 , 因此 emin 需要最多为 −1073(与 MPFR 中一样,所有数字均已归一化)。

如文档所述,mpfr_subnormalize函数认为次正规指数范围是从 emin 到 emin + PREC(x) − 1,因此例如,您需要设置 emin = −1073 模拟 IEEE double 。

关于c++ - 具有 MPFR 的不同精度的次正规数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38664778/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com