我有一个双倍,但不一定是积极的,但通常。它可以是0.xxxx000或X.xxxx00000或XX.00000或0.xxx0xxx00000,最后在最后一个数字的右边全部为0。我需要跟踪有多少位数。我一直遇到麻烦,有什么帮助吗?这是C。
答案 0 :(得分:6)
一个double有52个尾数位加一个隐含的“1”位,所以你应该能够将双指针打字到64位整数(将原始位变为整数),&amp; = this with (1 <&lt; 52)-1,| =(= <52)的结果。
log10将是小数位数。
尽管如此,我几乎倾向于说“与jonsca的解决方案一起使用”,因为它非常简单(在任何情况下都是KISS的值得+1)。
答案 1 :(得分:5)
使用sprintf将其变成一个字符串,并对数字做任何计数/测试
答案 2 :(得分:2)
double的表示不是十进制 - 它是二进制的(就像计算机中的所有其他数字一样)。你定义的问题真的没什么意义。考虑这个例子:数字1.2被转换为二进制 - 1 + 1/5 = 1.(0011)二进制[0011 in period]。如果你把它削减到52位精度(双倍) - 你将有1.0011001100110011001100110011001100110011001100110011二进制等于1 +(1-1 / 2 ^ 52)/ 5。如果你精确地以十进制形式表示这个数字,那么在全0之前会得到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)。