Исключение с плавающей точкой генерируется при приведении типа double к int - PullRequest
0 голосов
/ 08 февраля 2019

Рассмотрим этот код:

#include <iostream>
#include <climits>
#include <fenv.h>

int main()
{
    feenableexcept(FE_INVALID);
    double d = INT_MAX * 2.0f;
    int i = (int)d; // it throws here fp exception and terminates. Why ?

    std::cout << i << std::endl;

    return 0;
}

Первое, что здесь можно заметить, это то, что приведение double к int вызывает переполнение временного значения (оно больше INT_MAX), что, конечно,в общем случае неопределенное поведение.

Но меня больше беспокоит тот факт, что исключение FP здесь может быть перехвачено путем передачи константы FE_INVALID в функцию feenableexcept.

Из cpp_reference Я вижу, что FE_INVALID не имеет никакого отношения к переполнению вообще.

Почему тогда переполнение целыми числами здесь вызывает исключение fp?

Это из-за природы UB?

1 Ответ

0 голосов
/ 08 февраля 2019

Поскольку это стандарт UB по стандарту C ++, это, конечно, не определяется самим языком.

Однако ваша реализация следует IEEE-754 - стандарт большинства реализаций основывает свое поведение с плавающей запятой на-вэто отношение, которое гласит:

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

(5.8 "Подробности преобразований из чисел с плавающей точкой в ​​целочисленные форматы ", выделено мое)

Как эти исключения могут обрабатываться, когда сигнализируется, оставлено для реализации;включение ловушки для них - одна из возможностей.

Дополнительная информация: Документация gcc по исключениям FP

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