快速准确计算double的小数指数

标签 c performance math double

编辑:澄清一下,“ 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,这是一个可表示的值。

0.09999999999999999167332731531132594682276248931884765625 的

log10 大约为 ?−1.000000000000000036162279995748268157562864421 389843161585017393347605917054938808868324457086236340。这个数字不能用binary64表示;最接近的可表示值为-1。

因此,一个好的 log10 实现将为输入 0.09999999999999999167332731531132594682276248931884765625 返回 -1。

然后floor((log10(fabs(Value))))产生-1,但正确的结果是-2。

关于快速准确计算double的小数指数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76932140/

相关文章:

language-agnostic - 如何计算具有重复的集合中所有可能的唯一子集的总数?

c - scanf出错后输入检查

C 编程 If 语句不起作用

c - 返回指向字符串数组的指针 C

C++ Exp 与日志 : Which is faster?

java - 我们如何计算小于 1 的数字的对数值...?使用java

c++ - 确定旋转对象的位置

c - libRocket 需要哪些 FreeType2 库模块?

c# - 查找在多个句子中重复出现的三个最常见单词数组的算法

python - 调整传感器设置以提供最佳读数的最有效方法是什么?