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

C++ 双打在什么时候开始失去精度?,c++,floating-point,ieee-754,C++,Floating Point,Ieee 754,我的应用程序需要执行一些操作:>,C请参阅: 但是,请注意,decimal类型的范围小于double。也就是说,double可以保存更大的值,但它会丢失精度。或者,如MSDN所述: decimal关键字表示128位 数据类型。与浮点相比 类型,则十进制类型具有更大的 精度和较小的范围,这 使其适用于金融和金融领域 货币计算。近似值 小数点的范围和精度 类型如下表所示 十进制和双精度的主要区别在于。这意味着十进制存储精确的值,而double表示由分数表示的值,精度较低。十进制是128位,因此需要两

我的应用程序需要执行一些操作:>,C请参阅: 但是,请注意,decimal类型的范围小于double。也就是说,double可以保存更大的值,但它会丢失精度。或者,如MSDN所述:

decimal关键字表示128位 数据类型。与浮点相比 类型,则十进制类型具有更大的 精度和较小的范围,这 使其适用于金融和金融领域 货币计算。近似值 小数点的范围和精度 类型如下表所示

十进制和双精度的主要区别在于。这意味着十进制存储精确的值,而double表示由分数表示的值,精度较低。十进制是128位,因此需要两倍的存储空间。十进制的计算也是较慢的度量

如果您需要更高的精度,那么可以从.NET4使用BigInteger。您需要自己处理小数点。这里您应该知道,BigInteger是不可变的,所以对它进行任何算术运算都将创建一个新实例——如果数字很大,这可能会影响性能

我建议你仔细研究一下你到底需要多少精度。也许你的算法可以处理更小的标准化值?如果性能有问题,则其中一种内置浮点类型可能会更快。

C请参阅: 但是,请注意,decimal类型的范围小于double。也就是说,double可以保存更大的值,但它会丢失精度。或者,如MSDN所述:

decimal关键字表示128位 数据类型。与浮点相比 类型,则十进制类型具有更大的 精度和较小的范围,这 使其适用于金融和金融领域 货币计算。近似值 小数点的范围和精度 类型如下表所示

十进制和双精度的主要区别在于。这意味着十进制存储精确的值,而double表示由分数表示的值,精度较低。十进制是128位,因此需要两倍的存储空间。十进制的计算也是较慢的度量

如果您需要更高的精度,那么可以从.NET4使用BigInteger。您需要自己处理小数点。这里您应该知道,BigInteger是不可变的,所以对它进行任何算术运算都将创建一个新实例——如果数字很大,这可能会影响性能

我建议你仔细研究一下你到底需要多少精度。也许你的算法可以处理更小的标准化值?如果性能有问题,则其中一种内置浮点类型可能会更快。

双尾数中的位数是52,另外一个隐含位总是1。这意味着可以精确包含的最大值为2^53或9007199254740992

浮点尾数是23位,同样还有一个隐含位。可以精确表示的最大整数为2^24或16777216

如果您的目的是只保存整数值,那么通常有一个64位整数类型比双精度整数类型更合适

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

双尾数中的位数是52,还有一个额外的隐含位总是1。这意味着可以精确包含的最大值为2^53或9007199254740992

浮点尾数是23位,同样还有一个隐含位。可以精确表示的最大整数为2^24或16777216

如果您的目的是只保存整数值,那么通常有一个64位整数类型比双精度整数类型更合适


<>编辑:最初我有2 ^ 53-1和2 ^ 24-1,但是我意识到没有必要减去1 -偶数可以利用尾数右边的0位。< /P>请选择C或C++,因为在这些语言之间没有实现相同的两个。在我掉下来之前,我能走到悬崖的边缘多远?当您可以简单地将整数视为整数时,为什么要冒着丢失整数精度的风险?想要使用double的理由是什么?我认为不可能构造一个示例,其中n==5&&n==6在任何情况下都会计算为真。@dasblinkenlight:我说的是更大的数字。@AndreasBonini:所有32位整数都完全存储在double中,既然尾数是32位,请选择C或C++,因为两种语言之间没有相同的语言。在我跌倒之前,我能走到悬崖边多远?当您可以简单地将整数视为整数时,为什么要冒着丢失整数精度的风险呢
rs?想要使用double的理由是什么?我认为不可能构造一个示例,其中n==5&&n==6在任何情况下都会计算为真。@dasblinkenlight:我说的是更大的数字。@AndreasBonini:所有32位整数都完全存储在double中,由于尾数大于32位。9007199254740992.0==9007199254740993.0计算结果为真,并且似乎是数学意义上计算为相同数字的第一对整数。说2^53是可以包含的最大值并不准确。您真正的意思是2^53是最大的整数n,因此[-n,n]范围内的每个整数都可以精确地表示为双精度。@StephenCanon,感谢您的澄清。有时我的语言有点不准确。当然,如果尾数右侧有零,则较大的数字也可以精确表示,尽管在尝试使用它时,由于舍入可能会有一些微妙之处。@Guvante将整数的0.5改为0.5,因为这是舍入函数所能容忍的最大值。@unixman83:您是指保持0.5不变的数字吗?例如1.5!=2.5? 这大约是2^52+0.5。使用IEEE-754计算器可以得到精确的数字。9007199254740992.0==9007199254740993.0计算结果为真,并且似乎是数学意义上计算为相同数字的第一对整数。说2^53是可以包含的最大值并不准确。您真正的意思是2^53是最大的整数n,因此[-n,n]范围内的每个整数都可以精确地表示为双精度。@StephenCanon,感谢您的澄清。有时我的语言有点不准确。当然,如果尾数右侧有零,则较大的数字也可以精确表示,尽管在尝试使用它时,由于舍入可能会有一些微妙之处。@Guvante将整数的0.5改为0.5,因为这是舍入函数所能容忍的最大值。@unixman83:您是指保持0.5不变的数字吗?例如1.5!=2.5? 这大约是2^52+0.5。使用IEEE-754计算器可以得到准确的数字。