我正在执行一些需要将 、 和 表示uint
为long
IEEE ulong
754decimal
双浮点值的数据类型转换。我希望能够在执行转换之前检测 IEEE 754 数据类型是否不能包含该值。
一个蛮力解决方案是在演员表周围包裹一个 try-catch 以双重查找OverflowException
. 通读某些CLR 文档意味着某些转换只是默默地更改值,没有任何例外。
有没有万无一失的方法来做这个检查?我正在寻找完整性而不是易于实施。我有一种感觉,我将仔细阅读 IEEE 754 规范并仔细检查 matissa 和指数......
我应该补充一点,我最关心的是准确地表示整数,而浮点精度的损失是次要的问题(但仍然值得考虑)。
编辑: Int32 能够完全表示为 IEE-754。数据类型也是Decimal
问题的很大一部分。
重要更新:如果您指的是这个问题,您还应该阅读这个问题:IEEE-754 Double (64-bit floating point) vs. Long (64-bit Integer) Revisited
它指出了答案中的一个缺陷,即一些非常大的值也能够由 IEEE-754 精确表示。虽然这可能意味着该值将正确地往返,但出于我最初的目的(它将往返于 JavaScript)它不会。
CLRs System.Double 类型中似乎也存在一个错误,因为它不能正确地允许这些值往返。