Числовое преобразование - PullRequest
6 голосов
/ 21 марта 2012

В заголовке C ++ 11 есть три новые функции для преобразования между числом и строкой.

std::string std::to_string(unsigned long long);
std::string std::to_string(long double);
std::string std::to_string(long long);

Первый вопрос - почему существует только 3 функции?Как насчет простого int или unsigned int и т. Д .?

Второй вопрос - почему to_string не выдает исключение в следующем коде?

long double x = std::numeric_limits<long double>::quiet_NaN();
std::string i = std::to_string( x ); 
long double c = std::stold( i ); // i = "1.#QNAN"

И третий вопрос - почему c равно 1,0

Ответы [ 2 ]

5 голосов
/ 21 марта 2012
  • " Пока это приводит к описанному поведению, делайте, что вам угодно .. "

    Все внутренние числовые типы могут неявноможно преобразовать в unsigned long long, long double или long long и при этом сохранять требуемую точность, поэтому перегрузок больше не требуется.

    Стандарт гласит, что должны быть определены следующие функции, хотя библиотека, подтверждающая стандарт, может свободно делать " все, что хочет ", пока она ведет себя так же, как описано.


  • Почему должно выдаваться исключение?

    std::numeric_limits<long double>::quiet_NaN(); является допустимым значением, а std::to_string (T) описывается в стандарте для получения того же поведения, что и вызов sprintf с соответствующей строкой форматирования .

§ 21.5 / 6 Числовые преобразования

  • string to_string(int val);
  • string to_string(unsigned val);
  • string to_string(long val);
  • string to_string(unsigned long val);
  • string to_string(long long val);
  • string to_string(unsigned long long val);
  • string to_string(float val);
  • string to_string(double val);
  • string to_string(long double val);

    ..

Возвращает:

  • Каждая функция возвращает строковый объект, содержащийсимвольное представление значения его аргумента, которое будет сгенерировано вызовом sprintf (buf, fmt, val) со спецификатором формата "% d ", "% u ", "% ld ", "% lu ", "% lld ", "% llu ", "% f ", "% f " или "% Lf", соответственно, где buf обозначает внутренний символьный буфер достаточного размера.

  • На каком компилятореc равно 1.0?

    Преобразование должно давать NaN -значение, если значение i является строковым представлением NaN (не содержащим каких-либоцифры).

    Если подходящего преобразования не найдено, описывается функция, которая выдает invalid_argument.

    MSVC выдаст 1.#QNAN при попытке преобразовать std::numeric_limits<long double>::quiet_NaN(); to std::string.

    При использовании std::stold он будет искать первый непробельный символ, а затем использовать столько цифр, сколько найдено (в данном случае только 1), поэтому cпосле вызова функции будет равен 1.0.

1 голос
/ 21 марта 2012

Я нахожу весь пакет в своей копии стандарта:

string to_string(int val);
string to_string(unsigned val);
string to_string(long val);
string to_string(unsigned long val);
string to_string(long long val);
string to_string(unsigned long long val);
string to_string(float val);
string to_string(double val);
string to_string(long double val);

Возможно, ваш компилятор еще не реализовал их все?

Функциональность описана как

Returns: каждая функция возвращает строковый объект, содержащий символьное представление значения своего аргумента, который будет сгенерирован путем вызова sprintf(buf, fmt, val) с указателем формата "%d", "%u", "%ld", "%lu" , "%lld", "%llu", "%f", "%f" или "%Lf" соответственно, где buf обозначает внутренний символьный буфер достаточного размера.

Поскольку предполагается, что это обертка вокруг sprintf, вероятно, было решено не создавать исключений, поскольку sprintf этого не делает.

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