Преобразовать int64_t в двойной

  int64_t a = 1234;

  double d = (double) a;

Это рекомендуемый способ?


person kal    schedule 28.03.2009    source источник
comment
int64 не всегда хорошо отображает значение double. например, сравните максимальное значение double и максимальное значение int64. также обратите внимание, что double имеет 57 бит целых чисел, выше которых вы пропускаете некоторые целые числа, которые не могут быть представлены в двойном формате. в то время как int64 имеет 64 бита целых чисел, все смежные со своим соседом на 1. это очень разные диапазоны чисел.   -  person don bright    schedule 21.09.2015


Ответы (4)


используйте static_cast в качестве незнакомых ответов. Я рекомендую против использования неявного приведения (или даже приведения в стиле C в исходном коде C++) по нескольким причинам:

  • Неявные приведения являются распространенным источником предупреждений компилятора, что означает, что вы можете добавить шум в сборку (либо сейчас, либо позже, когда будут добавлены лучшие предупреждающие флаги).
  • Следующий программист обслуживания за вами увидит неявное приведение и должен знать, было ли это преднамеренным поведением или ошибкой/ошибкой. Наличие этого static_cast делает ваше намерение очевидным.
  • static_cast и другие приведения в стиле C++ легко обрабатываются grep.
person Tom    schedule 28.03.2009
comment
Намеренно: особенно когда присваивание далеко от объявления d, static_cast‹double› нарушает DRY. d = static_cast‹typeof(d)›(a) в этом отношении лучше, но тогда я теряю волю к жизни и думаю, что, может быть, d = a все-таки будет лучше ;-) - person Steve Jessop; 29.03.2009
comment
Вы правы, что это нарушает DRY... но C++ как язык все равно не является DRY, если вы рассматриваете предварительные объявления. Кроме того, IIRC, typeof(d) требует RTTI и ‹typeinfo›, которые нельзя использовать в некоторых средах. - person Tom; 30.03.2009
comment
... хотя вы правы... нарушение DRY вызовет какой-то странный код, если кто-то проведет незавершенный рефакторинг. поплавок д; d = static_cast‹double›(значение); // Что за фигня - person Tom; 30.03.2009

Вместо этого вы должны использовать static_cast или полагаться на неявное приведение:

int64_t a = 1234;
double d = static_cast<double>(a);
double f = a;
person strager    schedule 28.03.2009

Для типов POD обе версии делают одно и то же. Выберите тот, который вы предпочитаете, и будьте последовательны.

Я знаю многих людей, которые предпочитают первый из-за удобства ввода/читаемости, и я склонен согласиться с этим, но я могу жить и с тем, и с другим.

Я много раз слышал аргумент «легко искать», но еще ни разу не сталкивался с ситуацией, когда мне нужно было выполнить поиск моей кодовой базы для приведения POD.

person Andrew Grant    schedule 28.03.2009

Вы также можете использовать синтаксис преобразования, эквивалентный static_cast:

int64_t a = 1234;
double d = double(a);

Это полезная синтаксическая конструкция, поскольку она позволяет обрабатывать типы примитивов и классов одинаково в коде шаблона, либо выполняя static_cast для примитива, либо вызывая конструктор для типа класса.

person dcw    schedule 28.05.2009