我该如何设置浮点数的指数?
如何找到浮点数的尾数?
C++从 C继承了浮点特性的。C将浮点数建模为 ±be • sum(fk•b−k, 1 ≤ k ≤ p), 其中 b 是格式的固定基数,p 是固定精度 [数字位数]。e 是浮点表示中的指数部分,且 fk 是尾数的基数 b 的数字。尾数的值为sum(fk•b−k, 1 ≤ k ≤ p).
我想据此实现一种扩展范围的浮点格式,在大部分计算中使用本机浮点对象,并在必要时对其重新缩放以将指数保持在边界之内,同时在一个独立的整数对象中跟踪指数的变化。
解决方案
C++为此提供了一个标准函数,frexp,从C 继承而来。std::frexp(x, &e) 将返回 x,若可能,则将其缩放到 [½, 1) 区间内,并把相应的指数存储在 int e 中:
#include <iostream>
#include <cmath>
int main(void)
{
float x = .78125 * 1024;
int e;
float y = std::frexp(x, &e);
std::cout << "The significand of " << x << " is " << y << ".\n";
std::cout << "The exponent is " << e << ".\n";
}
(IEEE-754将尾数建模为在 [1, 2) 的二进制格式。要得到这个区间的尾数,只需使用 y = 2 * std::frexp(x, &e) 并从 e 中减去1。)
然而,实现扩展范围浮点运算的另一种方法是设定一些边界,例如2−63和 2+63。随后,当一个数的量级超出该范围(且非零、无穷大或NaN)时,通过乘以一个固定因子进行重新缩放,例如2+63与 2−63。这样做的优点是仅使用快速的基本浮点运算(比较和乘法),而不是可能较慢的库函数 frexp。
(注意,边界和补偿因子不必对称;它们可以根据应用需要进行调整。)
脚注
1零值、无穷大和NaN当然不能被缩放到 [½, 1) 区间。
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。