кастинг — C ++ Builder 2009 Float vs Long Double

Я смотрю на какой-то устаревший код, который пытается разыграть long double в float, От чтения http://www.cplusplus.com/forum/beginner/34088/ это выглядит как long double имеет sizeof() из 16, где поплавок имеет sizeof() из 8.

Когда на переменную ссылаются после приведения, вы получаете floating point overflow exception чего и следовало ожидать …

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

Так что это сводит вопрос к:

Есть ли способ сделать такое приведение, не получая переполнение (или альтернатива приведению, которая получила бы мне ту же информацию)?

Текущий кастинг выглядит так: floatVar = (float) longDoubleVar;

0

Решение

Преобразование значения типа long double к значению типа float является четким и значимым. Если результат слишком велик для хранения в floatрезультат — исключение с плавающей точкой, которое по умолчанию не имеет никакого эффекта; сохраненное значение +inf или же -inf,

Исключение с плавающей точкой не является исключением C ++; он специфичен для плавающей запятой и не будет виден при запуске вашего кода, если только вы не попытались установить обработчик перехвата с плавающей запятой. Может быть, ваша IDE устанавливает обработчик ловушек; Если это так, вам придется обратиться к документации, чтобы выяснить, как отключить эту «функцию».

3

Другие решения

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

Обычно компилятор выдает предупреждение, которое предупреждает о возможной потере данных. C ++ предлагает много форм приведения, но, к сожалению, переход от большего типа данных к меньшему типу данных всегда будет подвергаться риску переполнения. Я бы предположил, что в случае, если у вас есть здесь, содержимое длинных двойных переменных больше, чем может содержать float.

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

0

По вопросам рекламы [email protected]