「这是我参与11月更文挑战的第5天,活动详情查看:2021最后一次更文挑战」
浮点运算是否遵循关联性?换句话说,对于表达式“(A + B) + C”和“A + (B + C)”,我们是否总是得到相同的结果?
人们可能期望浮点数遵循编程语言中的结合性规则,因为它们在数学上是结合的。然而,并非在所有情况下都是如此。
考虑下面的 C/C++ 程序。
#include<stdio.h> int main() { float A = -500000000; float B = 500000000; float C = 1; printf("A + (B + C) 等于 %f \n", A + (B + C)); printf("(A + B) + C 等于 %f", (A + B) + C); return 0; } 复制代码
输出:
A + (B + C) 等于 0.000000 (A + B) + C 等于 1.000000 复制代码
从上面给出的输出中可以明显看出,浮点运算可能并非在所有情况下都遵循结合律。这是由于浮点数的存储和表示格式,它在计算过程中对数字进行四舍五入,因此,代数的关联定律不一定适用于浮点数。在这种情况下,
上述输出的解释: A + (B + C): (B + C) = 500000000.0 + 1.0 = 500000000.0 (在浮点运算过程中四舍五入) A + (B + C) = -500000000.0 + 500000000.0 = 0.000000 (A + B) + C: (A + B) = -500000000.0 + 500000000.0 = 0.000000 (A + B) + C = 0.000000 + 1 = 1.000000 复制代码
Java呢?
我们在 Java 中得到相同的结果,因为 Java 也使用类似的浮点数表示。
import java.io.*; class Main { public static void main (String[] args) { float A = -500000000; float B = 500000000; float C = 1; System.out.println("A + (B + C) 等于 " + (A + (B + C))); System.out.println("(A + B) + C 等于 " + ((A + B) + C)); } } 复制代码
输出:
A + (B + C) 等于 0.000000 (A + B) + C 等于 1.000000 复制代码
整数呢?
现在让我们在数据类型为整数时尝试相同的计算。这是一段代码供您观察:
#include<stdio.h> #include<stdio.h> int main() { int A = -500000000; int B = 500000000; int C = 1; printf(" A + (B + C) 等于 %d \n", A + (B + C)); printf("(A + B) + C 等于 %d", (A + B) + C); return 0; } 复制代码
输出:
A + (B + C) 等于 1 (A + B) + C 等于 1 复制代码
如果你发现任何不正确的地方,或者想分享有关上述主题的更多信息,可以在评论区告诉我