Я выполняю некоторые преобразования типов данных, где мне нужно представить uint
, long
, ulong
и decimal
как двойные значения с плавающей запятой IEEE 754. Я хочу быть в состоянии определить, может ли тип данных IEEE 754 не содержать значение, прежде чем выполнить преобразование.
Решением для грубой силы было бы обернуть пробную ловушку вокруг броска, чтобы удвоить поиск OverflowException
. Прочтение некоторых документов CLR подразумевает, что некоторые преобразования просто без каких-либо исключений изменяют значение.
Есть ли какой-нибудь надежный способ сделать эту проверку? Я ищу полноты над простотой реализации. У меня такое чувство, что я буду внимательно читать спецификацию IEEE 754 и тщательно проверять матиссу и экспоненту ...
Я должен добавить, что я большинство обеспокоен точным представлением целых чисел, и что потеря точности с плавающей запятой имеет второстепенное значение (но все же стоит рассмотреть).
РЕДАКТИРОВАТЬ: Int32 может быть полностью выражен как IEE-754. Кроме того, тип данных Decimal
является очень важной частью вопроса.
Важное обновление: Если вы имеете в виду этот вопрос, вам также следует прочитать этот вопрос: IEEE-754 Double (64-разрядная с плавающей запятой) против Long (64-разрядное целое) Revisited
Он отмечает недостаток в ответе, когда некоторые очень большие значения также могут быть точно представлены IEEE-754. Хотя это может означать, что значение будет правильно в обоих направлениях, для моей первоначальной цели (будет ли это в обоих направлениях в JavaScript) оно не будет.
Также, похоже, есть ошибка в типе CLRs System.Double, потому что он не позволяет правильно использовать эти значения в обратном направлении.