C、C++ 和 Java 中的浮点运算和关联性
2023-06-13 09:15:05 时间
theme: channing-cyan highlight: a11y-dark
「这是我参与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
如果你发现任何不正确的地方,或者想分享有关上述主题的更多信息,可以在评论区告诉我
相关文章
- pythoncharm注释快捷键_JAVA注释快捷键
- c++语言截取字符串,详解C++ string常用截取字符串方法
- java启动器_JAVA基础:Java 启动器如何查找类
- MySQL字段类型如何转为java_Java JDBC中,MySQL字段类型到JAVA类型的转换
- Java:利用递归实现分形[通俗易懂]
- java基本数据类型 think in java_Think in Java(一):Java基础[通俗易懂]
- JAVA项目集锦 Java项目视频20套
- java 自定义的类加载器_Java如何自定义类加载器[通俗易懂]
- java中notify作用_notify的过去式
- SAP Java Connector 的配置指南
- java事务_Java 事务详解[通俗易懂]
- java编写计算器详解编程语言
- Java并发编程之CyclicBarrier详解编程语言
- Oracle收购Java:瞩目引发的变革(oracle收购java)
- java搭建Linux环境下的Java SDK(sdk-linux)
- Java设计模式:23种设计模式全面解析(超级详细)
- 数据库Java连接MySQL数据库实现数据添加(java添加mysql)
- 客户端建立Redis集群:Java客户端指南(redis集群java)
- Java下使用Redis进行高效缓存优化(Redis缓存java)
- Java中使用Redis实现高性能应用(javaredis)
- 清除Java实现Redis数据过期自动清理(redisjava过期)
- 策略解决Java中使用Redis数据过期策略(redisjava过期)
- 让Java桥接Linux新世界的重要性(java链接linux)
- Linux下搭建 Java 开发环境(linux搭建java环境)
- 环境Linux下搭建Java调试环境快速指南(linuxjava调试)
- 应用Linux监控下Java应用性能分析(linux监控java)
- 实现高并发:Java利用Redis秒杀成功(java秒杀redis)
- Linux与Java结合:开启全新的编程之旅(linux java())
- 编程玩转Java之Oracle编程实战(java中的oracle)
- Java中基于Aspectwerkz的AOP
- 基于Java回顾之JDBC的使用详解