Учитывая удвоение, нужно найти сколько всего цифр - PullRequest
4 голосов
/ 28 марта 2011

У меня есть двойной, который не обязательно положительный, но обычно. Это может быть 0.xxxx000 или X.xxxx00000 или XX.00000 или 0.xxx0xxx00000, где в конечном итоге все 0 находятся справа от последнего числа. Мне нужно следить за количеством цифр. У меня были проблемы с этим, любая помощь? Это C.

Ответы [ 3 ]

6 голосов
/ 28 марта 2011

У двойного есть 52 бита мантиссы плюс неявный бит «1», так что вы должны иметь возможность набрать двойной указатель на 64-битное целое число (получая необработанные биты в целое число), & = this с ( 1 << 52) -1 и | = результат с (1 << 52). </p>

log10 этого будет количеством десятичных цифр.

Хотя я почти склонен сказать: «Пойди с решением Йонски», потому что это очень гениально просто (в любом случае он заслуживает +1 за то, что ты ПОЦЕЛУЙ).

5 голосов
/ 28 марта 2011

Используйте sprintf, чтобы превратить его в строку, и проведите любой подсчет / тестирование, которое вам нужно сделать для цифр

2 голосов
/ 28 марта 2011

Представление двойного числа не является десятичным - оно является двоичным (как и все другие числа в компьютере).Проблема, которую вы определили, не имеет особого смысла.Рассмотрим пример: число 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).

...