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