Что означает значение numeric_limits <double>:: digits10 - PullRequest
15 голосов
/ 14 апреля 2009

Что такое точное значение numeric_limits :: digits10? Некоторые другие связанные вопросы в stackoverflow заставили меня думать, что это максимальная точность двойной, но

  • Следующий прототип начинает работать (sucess is true), когда точность больше 17 (== 2 + numeric_limits :: digits10)
  • В STLPort readDouble == бесконечность в конце; с STL от Microsoft, readDouble == 0.0.
  • Имеет ли этот прототип какое-либо значение :)?

Вот прототип:

#include <float.h>
#include <limits>
#include <math.h>
#include <iostream>
#include <iomanip>
#include <sstream>
#include <string>
int main(int argc, const char* argv[]) {
  std::ostringstream os;
  //int digit10=std::numeric_limits<double>::digits10; // ==15
  //int digit=std::numeric_limits<double>::digits; // ==53
  os << std::setprecision(17);
  os << DBL_MAX;
  std::cout << os.str();
  std::stringbuf sb(os.str());
  std::istream is(&sb);
  double readDouble=0.0;
  is >> readDouble;
  bool success = fabs(DBL_MAX-readDouble)<0.1;
}

Ответы [ 5 ]

16 голосов
/ 14 апреля 2009

numeric_limits::digits10 - это количество десятичных цифр, которое можно хранить без потерь.

Например, numeric_limits<unsigned char>::digits10 равно 2. Это означает, что беззнаковый символ может держать 0..99 без потерь. Если бы было бы 3, оно могло бы содержать 0..999, но, как мы все знаем, оно может содержать только 0..255.

Эта страница руководства содержит пример чисел с плавающей запятой, который (при сокращении) показывает, что

cout << numeric_limits<float>::digits10 <<endl;
float f = (float)99999999; // 8 digits
cout.precision ( 10 );
cout << "The float is; " << f << endl;

печать

6
The float is; 100000000
7 голосов
/ 14 апреля 2009

numeric_limits :: digits10 указывает количество десятичных цифр слева от десятичной точки, которое вы можете представить без потери точности. Каждый тип будет иметь различное количество представимых десятичных значений.

6 голосов
/ 05 июня 2013

Смотрите эту очень читаемую статью: http://www.open -std.org / ОТК1 / SC22 / wg21 / документы / документы / 2006 / n2005.pdf

Хотя DBL_MAX (= std :: numeric_limits :: digits10 = 15 цифр) является минимальным гарантированным количеством цифр для двойного числа, предлагаемое в статье значение DBL_MAXDIG10 (= 17 цифр) обладает полезными свойствами:

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

  • Минимальное количество цифр, необходимое для преобразования двойного чтобы формировать строки и показывать разные строки каждый раз, когда вы получаете (A! = B) в коде. С 16 или менее цифрами, вы можете получить двойные, которые не равны в коде, но когда они преобразованы в строковую форму, они одинаковы (что даст случай, когда они отличаются при сравнении в коде, но файл журнала покажет их как идентичные - очень запутанные и трудно отлаживаемые!)

Когда вы сравниваете значения (например, просматривая их вручную, используя два файла журнала), мы должны помнить, что цифры 1-15 ВСЕГДА действительны, но различия в 16-й и 17-й цифрах МОГУТ быть ненужными .

6 голосов
/ 14 апреля 2009

'53' - это битовая ширина значения и , которое содержит ваш тип (double). «15» - это число десятичных цифр, которые можно представить безопасно с такой точностью.

2 голосов
/ 10 января 2016

digits10 для преобразования: строка → двойная → строка
max_digits10 для преобразования: двойной → строка → двойной

В вашей программе вы используете преобразование (double → string → double). Вы должны использовать max_digits10 вместо digits10.


Подробнее о digits10 и max_digits10 вы можете прочитать:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...