Tag: ieee 754

如何测试数字转换是否会改变值?

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

标准浮点数的0到1之间有多少个唯一值?

我想另一种表达这个问题的方法是使用只能在0和1之间的float小数位数吗? 我试着通过查看MSDN来解决这个问题。 其中精度为7位数。 我认为这意味着它只能跟踪0.0000001变化。 但是,如果我这样做: float test = 0.00000000000000000000000000000000000000000001f; Console.WriteLine(test); 它写出了9.949219E-44 如果我再添加零,它将输出0 。 我很确定我在这里遗漏了一些东西,因为这种准确度似乎非常错误。 主要是浮点数为32位,在该精度水平上仅为0-1,包含1e + 44个可能的数字……

如何以2个字节保存浮点数?

是的我知道IEEE-754半精度标准,是的,我知道在该领域所做的工作。 简单地说,我试图在2个字节中保存一个简单的浮点数(如52.1或1.25 )。 我已尝试过Java和C#中的一些实现,但它们通过解码不同的数字来破坏输入值。 你输入32.1 ,编码解码后得到32.0985 。 有没有什么方法可以在不破坏输入值的情况下以16位存储浮点数? 非常感谢。

小数点后双精度

在午休时间,我们开始讨论double值类型的精度。 我的同事认为,小数点后总是有15个位置。 在我看来,人们无法分辨,因为IEEE 754没有对此做出假设,它取决于第一个1在二进制表示中的位置。 (即小数点前的数字大小也计算在内) 如何才能做出更合格的陈述?

如何在C#中获取浮点数的IEEE 754二进制表示

我有一些单精度和双精度浮点数,我想写入并从字节[]中读取。 .Net中有什么东西可以用来将它们转换成32位和64位IEEE 754表示forms吗?

从IBM浮点转换为IEEE浮点标准和反向Versa In C#?

正在为我们正在使用的旧系统寻找IEEE浮点数到IBM浮点格式的方法。 我们可以在C#中使用通用公式吗?

查找具有相同内部表示的float / double的最小值/最大值

刷新浮点 (也是PDF ),IEEE-754并参与有关转换为字符串时浮点舍入的讨论 ,让我修补一下:如何获得给定浮点数的二进制表示的最大值和最小值是平等的。 免责声明 :对于本次讨论,我喜欢坚持IEEE-754所描述的32位和64位浮点。 我对扩展浮点(80位)或四边形(128位IEEE-754-2008)或任何其他标准(IEEE-854)不感兴趣。 背景 :计算机在二进制表示中表示不好。 在C#中,float在内部将此表示为3DCCCCCD (C#使用舍入到最近),将double表示为3FB999999999999A 。 相同的位模式用于十进制0.100000005 (浮点)和0.1000000000000000124 (双0.1000000000000000124 ),但不用于0.1000000000000000144 (双0.1000000000000000144 )。 为方便起见,以下C#代码给出了这些内部表示: string GetHex(float f) { return BitConverter.ToUInt32(BitConverter.GetBytes(f), 0).ToString(“X”); } string GetHex(double d) { return BitConverter.ToUInt64(BitConverter.GetBytes(d), 0).ToString(“X”); } // float Console.WriteLine(GetHex(0.1F)); // double Console.WriteLine(GetHex(0.1)); 在0.1的情况下,没有用相同的位模式表示的低十进制数,任何0.99…99将产生不同的位表示(即,浮点数为0.999999937 3F7FFFFF内部产生3F7FFFFF )。 我的问题很简单:如何找到内部存储在同一二进制表示中的给定float(或double)的最低和最高十进制值。 为什么 :(我知道你会问)在转换为字符串时从.NET中舍入时发现错误,当它从字符串转换时,找到内部精确值并更好地理解我自己的舍入错误。 我的猜测是这样的:取尾数,移除其余部分,得到其精确值,得到一个(尾数位)更高,并计算平均值:低于该值的任何东西将产生相同的位模式。 我的主要问题是:如何将小数部分作为整数(位操纵它不是我最强的资产)。 Jon Skeet的DoubleConverter课程可能会有所帮助。

c#和javascript中的IEEE 754浮点运算舍入误差

我刚读了一本关于javascript的书。 作者提到了IEEE 754标准中的浮点算术舍入误差。 例如,添加0.1和0.2会产生0.30000000000000004而不是0.3。 所以(0.1 + 0.2) == 0.3返回false。 我也在c#中重现了这个错误。 所以这些是我的问题是: 这种错误多久发生一次? c#和javascript中的最佳实践解决方法是什么? 哪些其他语言有相同的错误?

获得下一个最小的双号

作为unit testing的一部分,我需要测试一些边界条件。 一种方法接受System.Double参数。 有没有办法获得下一个最小的双值? (即将尾数减1个单位值)? 我考虑使用Double.Epsilon但这是不可靠的,因为它只是从零开始的最小增量,因此不适用于较大的值(即9999999999 – Double.Epsilon == 9999999999 )。 那么所需的算法或代码是什么: NextSmallest(Double d) < d ……总是如此。