C ++ - массив двойных указателей для преобразования с плавающей точкой - PullRequest
0 голосов
/ 04 июня 2018

Как правильно конвертировать double в float в c ++.Является ли преобразование неявным?

Вопрос 1: Рассмотрим double d = 5.0; и float f;

Какой из них правильный?

  • f = d;
  • f = (float)d;
  • f = static_cast<float>(d);

Вопрос 2: Теперь рассмотрим, что у нас есть

char *buffer = readAllBuffer(); 
double *d = (double*)(buffer + offset);
float f;

Какой из них сейчас правильный?

  • f = d[0];
  • f = (float)d[0];
  • f = static_cast<float>(d[0]);

Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 04 июня 2018

У вас есть одна серьезная проблема.Это недопустимо:

double *d = (double*)(buffer + offset);

Это нарушает строгие алиасы и, возможно, требования выравнивания.Вместо этого вам нужно использовать memcpy:

double d;
memcpy(&d, buffer + offset, sizeof d);
float f = d;

Любая из приведенных альтернатив может быть заменена на последнюю строку, важным изменением является разыменование указателя с неправильным типом и выравниванием до создания побайтной копии.

0 голосов
/ 04 июня 2018

Все они сводятся к одному и тому же, а использование массивов - это красная сельдь.Вы действительно можете написать

float f = d;

Некоторые люди утверждают, что static_cast делает код более читабельным, так как он выделяется так четко.Он также может игнорировать предупреждения о том, что некоторые компиляторы могут выдавать, если используется менее длинная форма.

Естественно, конечно, поскольку double - это расширенный набор float, вы можете потерять точность.Наконец, обратите внимание, что для

float f1 = whatever;
double d1 = f1;
float f2 = d1;

стандарт C ++ настаивает на том, что f1 и f2 должны быть одинаковыми.

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