delphi 单精度、双精度和精密

nxagd54h  于 2023-03-18  发布在  其他
关注(0)|答案(3)|浏览(292)

我知道存储单值(或双值)可能不是很精确。所以存储例如125.12可能会导致125.1200074788。现在在 Delphi 中,它们是一些有用的函数,如samevalue或comparevalue,它们以epsilon作为参数,并说125.1200074788或例如125.1200087952是相等的。
但我经常在代码中看到这样的东西:如果aSingleVar = 0,那么......事实上,正如我所看到的,这总是有效的。为什么?为什么在一个变量中存储0会保持精确的值?

pepwfjgg

pepwfjgg1#

只有m*2^e形式的值,其中m和e是整数,才能存储在浮点变量中(但不是所有的值,这取决于精度)。0具有这种形式,而125.12不具有这种形式,因为它等于3128/25,而1/25不是2的整数幂。
125.12与单(或双)精度变量进行比较,很可能总是返回False,因为文字125.12将被视为扩展精度数字,并且没有单(或双)精度数字会具有这样的值。

ne5o7dgx

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发生同样的事情。

qkf9rpyu

qkf9rpyu3#

看起来Rudy Velthuis对BigDecimals单元的使用很好。数百万个小数位的准确性和精度。

相关问题