繁体   English   中英

浮点加法/乘法/除法

[英]Floating Point Addition / Multiplication / Division

我在教科书上做了一些作业问题,并对某些算术运算的浮点取整/精度有一些疑问。

如果我像这样从int转换了双打:

int x = random();
double dx = (double) x; 

假设变量yzdydz遵循相同的格式。

然后将执行以下操作:

(dx + dy) + dz == dx + (dy + dz)
(dx * dy) * dz == dx * (dy * dz)

有联系吗? 我知道,如果我们有小数表示形式,那么它就没有关联性,因为舍入取舍取决于某些操作数彼此相加/相乘,因此会损失一些精度。 但是,由于这些都是从整数强制转换的,所以我觉得精度将不是问题,并且可以关联吗?

最后,我使用的教科书根本没有解释FP的除法运算,所以我想知道这句话是否正确,或者至少是浮点除法的一般工作原理:

dx / dx == dz / dz

我在网上查询了此内容,并在某些地方阅读了类似3/3这样的操作,它可以产生.999 ... 9,但没有足够的信息来说明这种情况是如何发生的,或者它是否会随其他部门的操作而变化。

假设int最多为32位,并且遵循IEEE-754的double double最多可以精确存储2 53的整数值。


如果是加法:

(dx + dy) + dz == dx + (dy + dz)

==两端都有其精确值,因此是关联的。


而在乘法的情况下:

(dx * dy) * dz == dx * (dy * dz)

该值可能超过2 53 ,因此不能保证它们相等。

您应该理解,浮点数通常在内部表示为符号位,定点尾数(对于IEEE 64位doubles为52位,其中隐含前导1)和二进制指数(对于IEEE doubles为11位)。 您可以将指数视为给定值的数学单位的“量子”。

如果所有和都适合尾数且指数不超过2 0 == 1,则该加法应该是关联的。如果random()产生32位整数,则适合(dx + dy) + dz和,并且该添加将是关联的。

在乘法的情况下,很容易看到2个32位数字的乘积可能远远超过53位,因此指数可能需要大于1才能使尾数包含结果的大小,因此关联性失败。

对于除法,在dx / dx的特定情况下,编译器可以将表达式替换为常数1.0(可能在零校验之后)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM