双打在什么时候开始失去精度?

问题描述 投票:1回答:2

我的应用程序需要执行一些操作:对某些数字进行><==!=+-++等(但不进行除法)。这些数字有时是整数,很少是浮点数。

如果我在内部甚至对整数使用“ double”类型(由IEEE 754定义),直到我可以安全地使用它们,就像它们是int一样,而不会出现奇怪的舍入错误(对于例如,n == 5 && n == 6都为真,因为它们四舍五入为相同的数字)?

显然,各种操作(+-等)的第二个输入始终是整数,我知道使用0.000[..]01自开始会遇到麻烦。

作为奖励,同样的问题,但float

c++ floating-point ieee-754
2个回答
10
投票

IEEE-754双尾数中的位数为52,并且有一个额外的隐含位始终为1。这意味着可以精确包含的最大值为2 ^ 53,或9007199254740992。

浮动尾数为23位,再次带有一个隐含位。可以精确表示的最大整数是2 ^ 24或16777216。

如果您打算只保留整数值,通常会使用64位整数类型,而不是双精度类型。

编辑:最初我有2 ^ 53-1和2 ^ 24-1,但是我意识到没有必要减去1-偶数可以利用尾数右边的隐含0位。


0
投票

C#指的是:但是,请注意,十进制类型的范围小于双精度型。该double可以保留较大的值,但这样做会失去精度。或者,如MSDN上所述:

小数关键字表示128位 数据类型。与浮点数相比 类型,十进制类型具有更大的 精度和较小的范围, 使它适合财务和 货币计算。大概 小数的范围和精度 类型如下表所示。

decimaldouble之间的主要区别是decimal is fixed-point and double is floating point。这意味着十进制存储一个精确值,而decimal表示一个由小数表示的值,并且精度较低。 double为128位,因此需要两倍的空间来存储。 double的计算也较慢(度量!)。

如果需要更高的精度,则可以从.NET 4使用decimal。(您需要自己处理小数点)。在这里您应该意识到,BigInteger是不可变的,因此对其进行任何算术运算都将创建一个新实例-如果数字很大,这可能会降低性能。

我建议您仔细研究所需的精度。也许您的算法可以使用更小的归一化值?如果性能是一个问题,则内置浮点类型之一可能会更快。

© www.soinside.com 2019 - 2024. All rights reserved.