我需要使用以下结构表示数字。这种结构的目的是不失去精度。
struct PreciseNumber
{
long significand;
int exponent;
}
使用这种结构,实际的 double 值可以表示为
value = significand * 10e^exponent
。现在,我需要编写实用程序函数,该函数可以将Double转换为PreciseNumber。
您能否让我知道如何从 double 中提取指数和有效数?
最佳答案
前奏有点瑕疵。
首先,除非对存储空间有任何限制,否则从双倍数转换为以10为底的有效指数形式将不会改变任何形式的精度。要理解这一点,请考虑以下内容:任何二进制终止分数(例如在典型IEEE-754浮点数上形成尾数的分数)都可以写成2的负幂之和。 2的每个负幂本身就是一个终止分数,因此可以得出它们的和也必须终止的结论。
但是,相反不一定是正确的。例如,0.3
base 10等效于base 2中的非终止0.01 0011 0011 0011 ...
。将其设置为固定大小的尾数会使其精度下降(这就是0.3
实际上存储为可转换回0.29999999999999999
的东西的原因)。
通过这种方式,我们可以假定,以十进制有效数字表示的形式存储数字所期望的任何精度要么丢失,要么根本无法获得。
当然,您可能会认为通过将十进制数存储为浮点数而导致的表观准确性损失是精度损失,在这种情况下,Decimal32和Decimal64浮点格式可能会引起人们的兴趣-请查看http://en.wikipedia.org/wiki/Decimal64_floating-point_format。
关于c++ - C++函数根据 double 进行10位有效+指数计算,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6271256/