我有一个不一定是积极的但通常是双重的。它可以是 0.xxxx000 或 X.xxxx00000 或 XX.00000 或 0.xxx0xxx00000,最终在最后一个数字的右边全是 0。我需要跟踪有多少位数。我遇到了这个问题,有什么帮助吗?这是C。
3 回答
双精度有 52 个尾数位加上一个隐含的“1”位,因此您应该能够将双精度指针键入 64 位整数(将原始位转换为整数),&= this with (1<< 52)-1,并且 |= (1<<52) 的结果。
其中的 log10 将是小数位数。
不过,我几乎倾向于说“使用 jonsca 的解决方案”,因为它非常巧妙地简单(无论如何它都值得 +1 作为 KISS)。
使用 sprintf 将其转换为字符串并执行您需要对数字进行的任何计数/测试
双精度的表示不是十进制的 - 它是二进制的(就像计算机中的所有其他数字一样)。你定义的问题真的没有什么意义。考虑这个例子:数字 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)。