Я использую Visual C++ для загрузки двоичных данных в float
, например:Исключить исключение «Недействительная операция с плавающей точкой»?
double dValue;
memcpy(&dValue, lpData, sizeof(dValue));
Для нормальных случаев, это будет работать должным образом. Однако в некоторых редких случаях, когда двоичные данные повреждены, dValue
будет недействительным, и любые дальнейшие операции над ним вызовут исключение «Недействительная операция с плавающей точкой».
Я проверяю dValue
в отладчике и отображается как -1.#QNAN00000000000
.
Чтобы предотвратить исключение, мне нужно проверить dValue
после его загрузки из двоичных данных. Я пытаюсь использовать:
if (_finite(dValue))
{
… do some tasks…
}
Но все-таки инвалид dValue
вызовет _finite
функции поднять Float-point invalid operation
исключения. Хотя _finite(dValue)
правильно вернет 0, исключение будет выделено в памяти. Даже если я освобожу его. Слишком много allocate/deallocate все равно исчерпывает системные ресурсы.
Таким образом, существует ли способ определить справедливость двойного значения без привлечения каких-либо исключений?
в стандартном C++ нет способа. Возможно, вы можете проверить спецификацию и код IEEE754 на что-то, что может сработать. –
Если ваш компилятор поддерживает C++ 11, вы должны использовать 'std :: isfinite' от' '. См. [Cppreference.com] (http://en.cppreference.com/w/cpp/numeric/math/isfinite) для получения дополнительной информации. –
paddy
@paddy, который все еще не решит проблему –