[英]Subnormal numbers in different precisions with MPFR
我想模拟各种n位二进制浮点格式,每种格式都有指定的e_max和e_min ,精度为p位。 我希望这些格式能够模拟次正规数,忠实于 IEEE-754 标准。
自然地,我的搜索使我找到了 MPFR 库,它符合 IEEE-754 标准,并且能够通过mpfr_subnormalize()
函数支持次mpfr_subnormalize()
。 但是,我在使用mpfr_set_emin()
和mpfr_set_emax()
正确设置非正常启用环境时遇到了一些困惑。 我将使用 IEEE 双精度作为示例格式,因为这是 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_max和e_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()
,以保证具有指数边界e_max和e_min的浮点格式的正确次正常行为? 似乎没有关于此事的任何详细文档或讨论。
衷心感谢,
詹姆斯。
编辑 30/07/16:这是一个小程序,它演示了单精度数的e_max和e_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·2 4 ,在 MPFR 中表示为 0.10001·2 5 。 如您所见,这意味着与 IEEE 754 相比,MPFR 中的指数增加了 1,因此 e max = 1024 而不是双精度的 1023。
关于双精度e min的选择,需要能够表示2 -1074 = 0.1·2 -1073 ,因此e min最多需要为-1073(如在MPFR中,所有数字都被归一化)。
如文档所述, mpfr_subnormalize
函数认为次正规指数范围是从 e min到 e min + PREC(x) − 1,因此例如,您需要设置 e min = −1073 以模拟 IEEE 双精度。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.