我知道存储单值(或双值)可能不是很精确。所以存储例如125.12可能会导致125.1200074788。现在在 Delphi 中,它们是一些有用的函数,如samevalue或comparevalue,它们以epsilon作为参数,并说125.1200074788或例如125.1200087952是相等的。但我经常在代码中看到这样的东西:如果aSingleVar = 0,那么......事实上,正如我所看到的,这总是有效的。为什么?为什么在一个变量中存储0会保持精确的值?
pepwfjgg1#
只有m*2^e形式的值,其中m和e是整数,才能存储在浮点变量中(但不是所有的值,这取决于精度)。0具有这种形式,而125.12不具有这种形式,因为它等于3128/25,而1/25不是2的整数幂。将125.12与单(或双)精度变量进行比较,很可能总是返回False,因为文字125.12将被视为扩展精度数字,并且没有单(或双)精度数字会具有这样的值。
m*2^e
0
125.12
3128/25
1/25
2
False
ne5o7dgx2#
十进制值的存储是通过存储以下各项的总和来完成的:[0|1]*2^n,其中n从+a到-B。示例(简化为三位存储):
3.5 = 1*2^1 + 1*2^0 + 1*2^-1 3.0 = 1*2^1 + 1*2^0 + 0*2^-1 2.5 = 1*2^1 + 0*2^0 + 1*2^-1 2.0 = 1*2^1 + 0*2^0 + 0*2^-1 1.5 = 0*2^1 + 1*2^0 + 1*2^-1 1.0 = 0*2^1 + 1*2^0 + 0*2^-1 0.5 = 0*2^1 + 0*2^0 + 1*2^-1 0.0 = 0*2^1 + 1*2^0 + 0*2^-1
但0.3不能准确存储:0*{0.5=2^-1} + 1*{0.25=2^-2} +......等等,直到无穷大,但是要相加的元素的数量是有限的,没有2的幂和能精确地给出0.3;在这样示例中,三位存储器将把0.3存储为1*{0.25 =2^-2} + 0*{0.25=2^-3} + 1*{0.25=2^-4} = 0.3125希望这种方式能更清楚地说明为什么存储十进制值是不精确的,因为存储是2的幂的和。当然,单和双有更多的有效小数比只有什么给三个比特,我用三个比特只是为了清楚地说明为什么小数不能准确地存储...不仅考虑圆周率和Sqrt(2)等像无理数等,有无限多的小数,也为简单的合理值作为3/10发生同样的事情。
qkf9rpyu3#
看起来Rudy Velthuis对BigDecimals单元的使用很好。数百万个小数位的准确性和精度。
3条答案
按热度按时间pepwfjgg1#
只有
m*2^e
形式的值,其中m和e是整数,才能存储在浮点变量中(但不是所有的值,这取决于精度)。0
具有这种形式,而125.12
不具有这种形式,因为它等于3128/25
,而1/25
不是2
的整数幂。将
125.12
与单(或双)精度变量进行比较,很可能总是返回False
,因为文字125.12
将被视为扩展精度数字,并且没有单(或双)精度数字会具有这样的值。ne5o7dgx2#
十进制值的存储是通过存储以下各项的总和来完成的:[0|1]*2^n,其中n从+a到-B。
示例(简化为三位存储):
但0.3不能准确存储:0*{0.5=2^-1} + 1*{0.25=2^-2} +......等等,直到无穷大,但是要相加的元素的数量是有限的,没有2的幂和能精确地给出0.3;在这样示例中,三位存储器将把0.3存储为1*{0.25 =2^-2} + 0*{0.25=2^-3} + 1*{0.25=2^-4} = 0.3125
希望这种方式能更清楚地说明为什么存储十进制值是不精确的,因为存储是2的幂的和。
当然,单和双有更多的有效小数比只有什么给三个比特,我用三个比特只是为了清楚地说明为什么小数不能准确地存储...不仅考虑圆周率和Sqrt(2)等像无理数等,有无限多的小数,也为简单的合理值作为3/10发生同样的事情。
qkf9rpyu3#
看起来Rudy Velthuis对BigDecimals单元的使用很好。数百万个小数位的准确性和精度。