c - 浮点加法/乘法/除法

标签 c floating-point floating-accuracy floating-point-conversion

我正在做教科书上的一些家庭作业,并且有一些关于某些算术运算的浮点舍入/精度的问题。

如果我像这样从 int 中转换了 double :

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 这样的运算可以产生 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/

相关文章:

c - 在 C 中连接两个字符串的安全方法

javascript - 什么位模式代表 double 浮点的最大值?

floating-point - 为什么编译器解析源文件中的 float 与运行时不同?

c - 从 log1pf() 计算 asinhf() 的最准确方法?

c - fwrite 似乎工作,memcpy 失败

c - 如何检查变量是否等于单词

c++ - 即使 float 不精确,Excel 如何成功地将它们舍入?

C 字符串到 float 的转换

c++ - int64_t 再次加倍到 int64_t,精度损失

c++ - 将字符缓冲区转换为整数(arduino)