У меня есть двойник, который не обязательно положительный, но обычно. Это может быть 0.xxxx000, или X.xxxx00000, или XX.00000, или 0.xxx0xxx00000, где в конце концов справа от последнего числа будут все 0. Мне нужно следить за количеством цифр. У меня были проблемы с этим, любая помощь? Это С.
Учитывая двойное число, нужно найти, сколько всего цифр
Ответы (3)
Используйте sprintf, чтобы превратить его в строку и выполнить любой подсчет/тестирование, которое вам нужно сделать с цифрами.
sprintf(s,"%.7f",x);
- преобразует до 7 цифр после '.'. Поэтому использование sprintf определенно не является решением.
- person Serge Dundich; 28.03.2011
sprintf( s, "%.50f", x);
? Конечно, вопрос не совсем ясен (особенно с учетом проблемы с основанием 2 и основанием 10, которую вы так хорошо описываете), но ответ Йонски может быть тем, что ищет спрашивающий.
- person tomlogic; 28.03.2011
sprintf( s, "%.52f", x )
может быть в порядке, если реализация sprintf идеальна (это, скорее всего, неверно). В любом случае, 52 — это какое-то странное магическое число, верное только для определенного двойного формата, который не является обязательным по стандарту C.
- person Serge Dundich; 29.03.2011
Двойной имеет 52 бита мантиссы плюс неявный бит «1», поэтому вы должны иметь возможность ввести двойной указатель на 64-битное целое число (получив необработанные биты в целое число), &= это с (1‹‹ 52)-1 и |= результат с (1‹‹52).
Log10 этого будет числом десятичных цифр.
Тем не менее, я почти склонен сказать: «Используйте решение Джонски», потому что оно настолько гениально простое (в любом случае оно заслуживает +1 за то, что это KISS).
Представление числа double не десятичное, а двоичное (как и все остальные числа в компьютере). Проблема, которую вы определили, на самом деле не имеет большого смысла. Рассмотрим пример: число 1.2 преобразуется в двоичное - 1+1/5 = 1.(0011) двоичное [0011 в периоде]. Если вы сократите его до 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;
}
Функция возвращает количество двоичных цифр перед всеми нулями, а также количество десятичных цифр перед всеми нулями (последняя десятичная цифра всегда 5, если возвращаемое значение > 0).