Что было бы правильным/рекомендуемым способом сообщить компилятору C++ «только предупредить меня о конверсиях с плавающей запятой, о которых я не знаю»?Корректное преобразование с плавающей запятой в C++
В C я бы включил предупреждения, связанные с преобразованиями с плавающей запятой, а затем я использовал бы явные приведения в стиле C, чтобы отключить предупреждения, связанные с контролируемыми преобразованиями.
Например, вычислительное a*a*a - b*b
весьма склонны к переполнению в одинарной точности с плавающей точкой, так что вы могли бы пожелать, чтобы вычислить его в двойной точности и идти только с одинарной точностью позже:
double a = 443620.52;
double b = 874003.01;
float c = (float)(a*a*a - b*b);
выше C-стиль явно cast заставляет замолчать предупреждение компилятора об конверсии от double
до float
.
Чтение C++ документация о слепков, я к выводу, что правильный способ сделать это в C++ будет выглядеть следующим образом:
double a = 443620.52;
double b = 874003.01;
float c = static_cast<float>(a*a*a - b*b);
Но, действительно ли это правильный способ сделать это в C++?
Я понимаю обоснование синтаксиса static_cast
ugly on purpose, так что вы избегаете отливок, если это возможно.
Да, я могу опустить явное приведение в поплавок. Но тогда мне нужно отключить предупреждения компилятора, которые говорят мне о прецизионной потере (или, иначе, я бы получил ряд неуместных предупреждений, которые затруднили бы уведомление действительно релевантных предупреждений). И если я отключу предупреждения компилятора, связанные с fp, я бы потерял возможность быть предупрежденным, когда я ошибочно теряю точность в других местах кода.
Итак, каков правильный подход для конверсий с плавающей запятой в C++?
Но отливки от 'double' до' float' часто встречаются при программировании с плавающей запятой. «Static_cast» «уродство» было бы незаслуженным наказанием ИМХО, учитывая, что актерский состав не только законен, но и необходим, и невозможно избежать того, насколько хорош стиль кодирования. – cesss
Большое спасибо, ваш совет относительно определения функции полностью удовлетворяет мои потребности, и это чистый стиль программирования на C++. – cesss
Объяснение приза голосования будет приветствоваться. –