给定一个double,需要找到总共有多少位数

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

使用sprintf将其转换为字符串,并对数字进行计数/测试

double有52个尾数位加上一个隐含的“1”位,所以你应该能够将双指针打字到64位整数(将原始位变为整数),&= this with(1 << 52)-1,| =与(1 << 52)的结果。

log10将是十进制数字的数字。

虽然,我几乎倾向于说“与jonsca的解决方案一起使用”,因为它非常简单(在任何情况下它都应该为KISS)。

double的表示不是十进制 – 它是二进制的(就像计算机中的所有其他数字一样)。 你定义的问题真的没什么意义。 考虑这个例子:数字1.2被转换为二进制 – 1 + 1/5 = 1.(0011)二进制[0011 in period]。 如果你把它削减到52位精度(双倍) – 你将有1.0011001100110011001100110011001100110011001100110011二进制等于1+(1-1 / 2 ^ 52)/ 5。 如果你精确地以十进制forms表示这个数字,那么在全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)。