我正在做教科书上的一些家庭作业,并且有一些关于某些算术运算的浮点舍入/精度的问题。
如果我像这样从 int 中转换了 double :
int x = random();
double dx = (double) x;
假设变量 y、z、dy 和 dz 遵循相同的格式。
然后操作会像:
(dx + dy) + dz == dx + (dy + dz)
(dx * dy) * dz == dx * (dy * dz)
具有关联性?我知道,如果我们有分数表示,那么它就不会是关联的,因为根据哪些操作数彼此相加/相乘而进行的舍入会导致一些精度丢失。然而,由于这些是从整数转换的,我觉得精度不会有问题,而且这些可以是关联的?
最后,我使用的教科书根本没有解释 FP 除法,所以我想知道这个说法是否正确,或者至少是浮点除法一般如何工作:
dx / dx == dz / dz
我在网上查到了这一点,并在某些领域读到过,例如像 3/3 这样的运算可以产生 0.999...9,但没有足够的信息来解释这是如何发生的,或者它是否会因其他除法运算而有所不同。
最佳答案
假设int
最多为32位,double
遵循IEEE-754。 double
最多可以精确存储 253 整数值。
添加的情况下:
(dx + dy) + dz == dx + (dy + dz)
==
的两边都有其精确的值,因此它是关联的。
在乘法的情况下:
(dx * dy) * dz == dx * (dy * dz)
该值有可能超过 253,因此不保证它们相等。
关于c - 浮点加法/乘法/除法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30090897/