c ++ вывести номер в шестнадцатеричном формате сразу после функции пола - PullRequest
0 голосов
/ 26 октября 2019

Я заметил странное поведение в c ++, которое я не понимаю, я пытаюсь напечатать усеченный двойник в шестнадцатеричном представлении

этот вывод кода 17 , которыйявляется десятичным представлением

double a = 17.123;
cout << hex << floor(a) << '\n';

, в то время как этот вывод кода 11 , а также мой желаемый вывод

double a = 17.123;
long long aASll = floor(a);
cout << hex << aASll << '\n';

, поскольку double может получить действительнобольшие числа я боюсь неправильного вывода при сохранении усеченного числа в длинной длинной переменной, какие-либо предложения или улучшения?

Ответы [ 2 ]

0 голосов
/ 26 октября 2019

Просто напишите свою собственную версию floor и пусть она возвращает целое значение. Например:

long long floorAsLongLong(double d)
{
  return (long long)floor(d);
}

int main() {
  double  a = 17.123;
  cout << hex << floorAsLongLong(a) << endl;
}
0 голосов
/ 26 октября 2019

Цитирование страницы документации CPPreference для std::hex (и друзей)

Изменяет числовую базу по умолчанию для целочисленного ввода / вывода.

Это говорит о том, что std::hex не влияет на входные данные с плавающей запятой. Лучшее, что вы получите, это

cout << hex << static_cast<long long>(floor(a)) << '\n';

или функция, которая делает то же самое.

uintmax_t из <cstdint> может быть полезно для получения наибольшего доступного целого числа, если значениявсегда позитивны. В конце концов, что такое отрицательное шестнадцатеричное число?

Поскольку значение double может легко превышать максимальное разрешение доступных целых чисел, оно не будет охватывать весь диапазон. Если промежуточные значения превышают то, что может поместиться в целочисленный тип, вам придется выполнить преобразование вручную или использовать большую целочисленную библиотеку.

Примечание: std::hexfloat делает что-то совсем другое и работает некорректно во всех компиляторах из-за некачественной формулировки в текущем стандарте , которая с тех пор была разработана и должна быть исправлена ​​в следующей редакции.

...