4

我有一个不一定是积极的但通常是双重的。它可以是 0.xxxx000 或 X.xxxx00000 或 XX.00000 或 0.xxx0xxx00000,最终在最后一个数字的右边全是 0。我需要跟踪有多少位数。我遇到了这个问题,有什么帮助吗?这是C。

4

3 回答 3

6

双精度有 52 个尾数位加上一个隐含的“1”位,因此您应该能够将双精度指针键入 64 位整数(将原始位转换为整数),&= this with (1<< 52)-1,并且 |= (1<<52) 的结果。

其中的 log10 将是小数位数。

不过,我几乎倾向于说“使用 jonsca 的解决方案”,因为它非常巧妙地简单(无论如何它都值得 +1 作为 KISS)。

于 2011-03-28T13:22:46.700 回答
5

使用 sprintf 将其转换为字符串并执行您需要对数字进行的任何计数/测试

于 2011-03-28T13:15:31.677 回答
2

双精度的表示不是十进制的 - 它是二进制的(就像计算机中的所有其他数字一样)。你定义的问题真的没有什么意义。考虑这个例子:数字 1.2 被转换为二进制 - 1+1/5 = 1.(0011) 二进制 [0011 in period]。如果你将它削减到 52 位精度(双精度) - 你将得到 1.0011001100110011001100110011001100110011001100110011 二进制,等于 1+(1-1/2^52)/5。如果你以十进制形式精确表示这个数字,你将在全零之前得到 52 个小数,这比 16 位双精度的最大十进制精度要高得多(从 17 到 52 的所有表示数字都是没有意义的) .

无论如何,如果您有纯粹的抽象问题(例如在学校):

int f( double x )
{
  int n = 0;

  x = fabs(x);
  x -= floor(x);

  while( x != floor(x) )
  {
    x *= 2;
    ++n;
  }

  return n;
}

该函数返回全零之前的二进制位数,它也是全零之前的十进制位数(如果返回值> 0,则最后一位十进制数字始终为 5)。

于 2011-03-28T14:18:28.503 回答