Я смотрю на какой-то устаревший код, который пытается разыграть long double
в float
, От чтения http://www.cplusplus.com/forum/beginner/34088/ это выглядит как long double
имеет sizeof()
из 16, где поплавок имеет sizeof()
из 8.
Когда на переменную ссылаются после приведения, вы получаете floating point overflow exception
чего и следовало ожидать …
При работе в режиме отладки среда IDE будет показывать вам исключение каждый раз, если вы не игнорируете весь этот тип. Я не хочу этого делать, так как хочу решить проблему должным образом.
Так что это сводит вопрос к:
Есть ли способ сделать такое приведение, не получая переполнение (или альтернатива приведению, которая получила бы мне ту же информацию)?
Текущий кастинг выглядит так: floatVar = (float) longDoubleVar;
Преобразование значения типа long double
к значению типа float
является четким и значимым. Если результат слишком велик для хранения в float
результат — исключение с плавающей точкой, которое по умолчанию не имеет никакого эффекта; сохраненное значение +inf
или же -inf
,
Исключение с плавающей точкой не является исключением C ++; он специфичен для плавающей запятой и не будет виден при запуске вашего кода, если только вы не попытались установить обработчик перехвата с плавающей запятой. Может быть, ваша IDE устанавливает обработчик ловушек; Если это так, вам придется обратиться к документации, чтобы выяснить, как отключить эту «функцию».
Поплавок никогда не сможет содержать содержимое длинного двойника, если вы не знаете, что содержимое длинного двойника может поместиться внутри поплавка без усечения данных.
Обычно компилятор выдает предупреждение, которое предупреждает о возможной потере данных. C ++ предлагает много форм приведения, но, к сожалению, переход от большего типа данных к меньшему типу данных всегда будет подвергаться риску переполнения. Я бы предположил, что в случае, если у вас есть здесь, содержимое длинных двойных переменных больше, чем может содержать float.
Единственный способ, которым переполнение не произошло бы, было бы, если вы переходите от меньшего типа данных к большему. Исключение составляют случаи, когда содержимое большего размера вписывается в границы меньшего типа (что в некоторых случаях все равно будет выдавать предупреждение).