C ++ Builder 2009 Float против Long Double

0

Я смотрю на некоторый код устаревшего кода, который пытается использовать 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;

Теги:
casting
c++builder
long-double

2 ответа

3
Лучший ответ

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

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

0

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

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

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

  • 0
    Усечение данных не вызывает исключения с плавающей запятой.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню