编辑:澄清一下,“ double 的十进制指数”是指值的大小或值的以 10 为底的指数。例如 3456.7 -> 3.4567E3 -> 科学指数 = 3
我需要找到 double 的十进制指数。
我一直在研究实现此目的的方法,并且找到了各种方法。
例如,为了估计指数,Microsoft 的 STL 使用 interesting lookup table :
但是,我想出的方法似乎是最简单的:
// v -> value
// x -> ScientificExponent
// 10^x <= v < 10^(x+1)
// x <= log(v) < x+1
ScientificExponent = (Value == 0) ? 1 : floor((log10(fabs(Value))));
我想知道为什么不使用它。有没有这种方法不起作用的情况?这是否被认为太慢了?
是否有我没有考虑的边缘/角落情况(可能次正常值太小而无法获得准确的对数计算)?
我很感激人们能够提供的任何见解。
另外,如果这是一个好方法,那么有没有一个好方法只计算 log10 的整数部分?将日志计算到许多小数位然后将其与下限
一起丢弃似乎是一种浪费。
最佳答案
floor((log10(fabs(Value))))
不足以计算数字的十进制指数。
考虑使用 IEEE-754 二进制 64(“ double ”)。令值
为0.09999999999999999167332731531132594682276248931884765625 = 9.9999999999999991673327315311325946822762489318847656 25•10−2,这是一个可表示的值。
log10 大约为 ?−1.000000000000000036162279995748268157562864421 389843161585017393347605917054938808868324457086236340。这个数字不能用binary64表示;最接近的可表示值为-1。
因此,一个好的 log10
实现将为输入 0.09999999999999999167332731531132594682276248931884765625 返回 -1。
然后floor((log10(fabs(Value))))
产生-1,但正确的结果是-2。
关于快速准确计算double的小数指数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76932140/