C、C++ 和 Java 中的浮点运算和关联性

简介: 浮点运算是否遵循关联性?换句话说,对于表达式“(A + B) + C”和“A + (B + C)”,我们是否总是得到相同的结果?

「这是我参与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
复制代码


如果你发现任何不正确的地方,或者想分享有关上述主题的更多信息,可以在评论区告诉我


目录
相关文章
|
2天前
|
算法 Java C语言
C++和Java中的随机函数你玩明白了吗?内附LeetCode470.rand7()爆改rand10()巨详细题解,带你打败LeetCode%99选手
C++和Java中的随机函数你玩明白了吗?内附LeetCode470.rand7()爆改rand10()巨详细题解,带你打败LeetCode%99选手
|
2天前
|
Java C++
部落(pta)(并查集) Java以及C++
部落(pta)(并查集) Java以及C++
11 2
|
2天前
|
Java C++
愤怒的牛(java c++)(二分典型例子)
愤怒的牛(java c++)(二分典型例子)
8 1
|
2天前
|
编解码 JavaScript 前端开发
【专栏】介绍了字符串Base64编解码的基本原理和在Java、Python、C++、JavaScript及Go等编程语言中的实现示例
【4月更文挑战第29天】本文介绍了字符串Base64编解码的基本原理和在Java、Python、C++、JavaScript及Go等编程语言中的实现示例。Base64编码将24位二进制数据转换为32位可打印字符,用“=”作填充。文中展示了各语言的编码解码代码,帮助开发者理解并应用于实际项目。
|
2天前
|
Java C++ Kotlin
进制转换在C/C++/Java/Kotlin中的应用(详细版)(下)
进制转换在C/C++/Java/Kotlin中的应用(详细版)
13 1
|
2天前
|
存储 人工智能 Java
进制转换在C/C++/Java/Kotlin中的应用(详细版)(上)
进制转换在C/C++/Java/Kotlin中的应用(详细版)
9 0
|
2天前
|
存储 Java C++
leetcode 2525 根据规则将箱子分类 c++ pyhton java c题解
leetcode 2525 根据规则将箱子分类 c++ pyhton java c题解
14 1
|
2天前
|
算法 IDE Java
【软件设计师备考 专题 】面向对象程序设计语言:C++、Java、Visual Basic和Visual C++
【软件设计师备考 专题 】面向对象程序设计语言:C++、Java、Visual Basic和Visual C++
53 0
|
2天前
|
Java API 开发工具
【软件设计师备考 专题 】C、C++、Java、Visual Basic、Visual C++等语言的基础知识和应用(三)
【软件设计师备考 专题 】C、C++、Java、Visual Basic、Visual C++等语言的基础知识和应用
32 0
|
2天前
|
Java 数据处理 数据库
【软件设计师备考 专题 】C、C++、Java、Visual Basic、Visual C++等语言的基础知识和应用(二)
【软件设计师备考 专题 】C、C++、Java、Visual Basic、Visual C++等语言的基础知识和应用
37 0