【C语言】深入理解C语言中的数学运算和类型转换
文章目录
- 引言
- 取负运算的奥秘
- 源码探索
- 分析与解读
- 浮点数运算的精细差异
- 源码分析
- 精度损失与隐式类型转换
- 精度和除零运算探究
- float类型和double类型的精度各是多少(即十进制有效位的位数)?
- 在你的机器上,“负数开方”是如何处理的(如“-8.0/0”、“sqrt(-4.0)”的运算结果)?
- 在你的机器上,整数除0和浮点数除0的运行结果各是什么?为什么会有不同的运行结果?,并将“-6.0/0”和“-6/0”的运行结果进行比较。
- 结语
引言
在编程中,理解各种数据类型的运算规则是至关重要的。本文将通过几个示例,深入探讨C语言中整数和浮点数的取负运算、浮点数的精度问题以及除零运算的处理机制。
取负运算的奥秘
源码探索
分析以下简单的C程序:
int main()
{int x = -2147483648;int y = 3;float f = 1.5;printf("%d\n", -x > y);printf("%f\n", -f);return 0;
}
分析与解读
-
当我们对整数
x
取负时,由于它已经是32
位整数的最小可能值,其补码表示无法再表示一个更大的正数,因此-x
仍然等于-2147483648
。这导致-x > y
的判断为假
,因此第一个printf
输出为0
。 -
另一方面,浮点数
f
的取负运算简单明了,结果自然就是-1.5
。因此,第二个printf
输出-1.500000
。
浮点数运算的精细差异
源码分析
接下来,我们看一个涉及浮点数运算的程序:
#include <stdio.h>
int main()
{float x = -1.5e38;float y = 1.5e38;float z = 1.0;int i = (x + y) + z;int j = x + (y + z);printf("%d\n", i == j);return 0;
}
精度损失与隐式类型转换
-
在上述代码中,我们试图通过不同的运算顺序来比较结果是否相同。然而,由于浮点数的精度限制和整数类型的截断行为,
i
和j
得到的结果很可能不同,因此输出为0(false)
。这个例子清晰地展示了浮点数运算中的精度损失和隐式类型转换可能导致的意外结果。 -
在表达式
(x + y) + z
中,x
和y
是浮点数,而 z 是浮点数转换为整数后的结果。根据C语言的运算规则,当一个浮点数和一个整数进行运算时,整数会被自动转换为浮点数。因此,(x + y)
的结果是一个浮点数,再加上z
后得到的结果也是一个浮点数。然而,由于i
是整型变量,这个浮点数会被截断成整数并赋值给i
。
类似地,在表达式x + (y + z)
中,y
和z
是浮点数,而x
是一个负浮点数。同样根据C语言的运算规则,负浮点数和浮点数进行运算时,会进行隐式类型转换,使结果仍为浮点数。因此,(y + z)
的结果是一个浮点数,再加上x
后得到的结果也是一个浮点数。然而,由于j
是整型变量,这个浮点数会被截断成整数并赋值给j
。 -
如果想要避免隐式类型转换,可以显式地进行类型转换操作,将浮点数转换为整型。例如,可以使用
int(i)
或int(j)
来将浮点数转换为整型。这样可以确保进行精确的整数比较
精度和除零运算探究
float类型和double类型的精度各是多少(即十进制有效位的位数)?
#include <stdio.h>
#include <float.h>int main() {printf("float类型的十进制有效位数: %d\n", FLT_DIG);printf("double类型的十进制有效位数: %d\n", DBL_DIG);return 0;
}
在C语言中,可以使用float.h
头文件中定义的常量来获取float
和double
类型的精度信息。具体而言,FLT_DIG和DBL_DIG
分别表示float
和double
类型的十进制有效位数。
这段代码将打印出float
和double
类型的十进制有效位数。在大多数系统上,你会看到类似以下的输出:
float
类型的十进制有效位数: 6
double
类型的十进制有效位数: 15
这样就直接获取了float
和double
类型的十进制有效位数,而无需手动计算。
在你的机器上,“负数开方”是如何处理的(如“-8.0/0”、“sqrt(-4.0)”的运算结果)?
- 当进行表达式
-8.0/0
进行计算时,结果会被认为是负无穷大(-∞)。这是因为除以零是一个非法的操作,C语言规定将其视为一种特殊情况,结果被定义为负无穷大或正无穷大。
- 当进行表达式
sqrt(-4.0)
进行计算时,结果会被认为是一个特殊值NaN(Not a Number)
,表示无效的操作。负数的平方根是一个虚数,在实数域中没有定义。
在你的机器上,整数除0和浮点数除0的运行结果各是什么?为什么会有不同的运行结果?,并将“-6.0/0”和“-6/0”的运行结果进行比较。
在VS中,错误C2124表示发生了除以零或求模运算中的被零除的情况。这个错误通常出现在编译时,是因为代码中存在了除以零或对零求模的操作,这是一种不合法的操作。
这个错误会阻止程序的继续编译,因为除以零是一种未定义的行为,违反了数学和计算机的基本规则。
要解决这个错误,你需要检查代码中是否存在除以零或对零求模的操作,并确保避免这种情况的发生。可以通过添加适当的条件判断来避免除以零或对零求模,在进行除法或求模运算之前检查除数是否为零。
例如,可以使用条件语句来避免除以零的情况:
if(b != 0) {result = a / b; // 在除数不为零时执行除法运算
}
else{// 处理除数为零的情况,例如输出错误信息或采取其他操作printf("除数不能为零\n");
}
结语
通过本文的分析,我们了解了C语言中数学运算和类型转换的一些关键细节。从取负运算到浮点数的精度,再到除零的处理,每个概念都对编写可靠和高效的代码至关重要。希望这篇文章能帮助你在未来的编程实践中避免一些常见的陷阱。
相关文章:
【C语言】深入理解C语言中的数学运算和类型转换
文章目录 引言取负运算的奥秘源码探索分析与解读 浮点数运算的精细差异源码分析精度损失与隐式类型转换 精度和除零运算探究float类型和double类型的精度各是多少(即十进制有效位的位数)?在你的机器上,“负数开方”是如何处理的&a…...
基于javaweb的宠物服务商城系统设计与开发
摘 要 最近几年以来,宠物在人们的日常生活中所占的地位越来越重要了,它们不仅仅是我们的朋友,也成为了我们家庭中的一份子。21世纪,信息技术飞速发展,计算机行业日新月异,极大地带动了信息的流动ÿ…...
LeetCode-470. 用 Rand7() 实现 Rand10()【数学 拒绝采样 概率与统计 随机化】
LeetCode-470. 用 Rand7 实现 Rand10【数学 拒绝采样 概率与统计 随机化】 题目描述:解题思路一:首先说一个结论就是(rand_X() - 1) Y rand_Y() > [1,X*Y],即可以等概率的生成[1, X * Y]范围的随机数,其实就像军训的时候报数…...
通达信指标公式19:龙虎榜股票池——主力控盘度的计算方法
0.小红牛本指标,选股的思路说明:控盘度,又称主力控盘,是指主力控制了某只股票的大部分流通股,从而控制了股票的价格。主力控盘的目的通常是为了获取更多的收益,通过控制股票价格来实现其策略。所以首要分析…...
手搓图片滑动验证码_JavaScript进阶
手搓图片滑动验证码 背景代码效果图展示网站 背景 在做前端项目开发的时候,少不了登录注册部分,既然有登录注册就少不了机器人验证,验证的方法有很多种,比如短信验证码、邮箱验证码、图片滑动、图片验证码等。 由于鄙人在开发中…...
Linux服务器超级实用的脚本
1.使用INOTIFY+RSYNC自动实时同步数据 代码执行: bash inotify_rsyncs.sh :cat inotify_rsyncs.sh 脚本内容如下: #!bing/bash # Author: reyn #检测/data路径下的文件变化,排除Temp目录 INOTIFY_CMD="inotifywait -mrq -e modify,create,move,delete /data/ --exc…...
IntelliJ IDEA安装使用教程#intellij idea
做为基础开发软件,idea、pycharm、phpstorm是高级企业级开发中常用的图形化工具。 安装非常简单:去官网下载即可,有社区版本、有企业版本: IntelliJ IDEA – 领先的 Java 和 Kotlin IDE 因版权问题:这里不方面多讲。…...
【组合数学】容斥鸽巢原理
目录 1. 容斥原理容斥原理三种形式 2. 容斥原理应用有限重复数的多重集合的 r 组合数错排问题 3. 鸽巢原理4. Ramsey 定理 1. 容斥原理 容斥原理提供了一种通过计算每个单独集合的大小,然后修正重复计数的方法,从而得到多个集合并集大小的计算方法。它通…...
视频后期特效处理软件 Motion 5 mac中文版
Motion mac是一款运动图形和视频合成软件,适用于Mac OS平台。 Motion mac软件特点 - 精美的效果:Motion提供了多种高质量的运动图形和视频效果,例如3D效果、烟雾效果、粒子效果等,方便用户制作出丰富多彩的视频和动画。 - 高效的工…...
【智能家居】一、工厂模式实现继电器灯控制
用户手册对应的I/O 工厂模式实现继电器灯控制 代码段 controlDevice.h(设备设备)main.c(主函数)bathroomLight.c(浴室灯)bedroomLight.c(卧室灯)restaurantLight.c(餐厅…...
第三节:提供者、消费者、Eureka
一、 提供者 消费者(就是个说法、定义,以防别人叭叭时听不懂) 服务提供者:业务中被其他微服务调用的服务。(提供接口给其他服务调用)服务消费者:业务中调用其他微服务的服务。(调用…...
Leetcode刷题详解——等差数列划分
1. 题目链接:413. 等差数列划分 2. 题目描述: 如果一个数列 至少有三个元素 ,并且任意两个相邻元素之差相同,则称该数列为等差数列。 例如,[1,3,5,7,9]、[7,7,7,7] 和 [3,-1,-5,-9] 都是等差数列。 给你一个整数数组 …...
导出主机上所有docker 镜像并导入到其它主机
保存镜像列表到文件 docker images --format “{{.Repository}}:{{.Tag}}” > image_list.txt 导出列表中所有镜像到tar文件 cat image_list.txt | xargs -L 1 docker save -o all_images.tar 导入tar包中所有镜像 docker load -i all_images.tar...
HTML5+CSS3+JS小实例:焦点图波浪切换动画特效
实例:焦点图波浪切换动画特效 技术栈:HTML+CSS+JS 字体图标库:Font Awesome 效果: 源码: 【HTML】 <!DOCTYPE html> <html><head><meta http-equiv="content-type" content="text/html; charset=utf-8"><meta name=&…...
Mac电脑如何安装git
一、简介 在Mac上安装Git之前,可以先使用git --version来查看一下是否安装了Git,因为Mac系统可能自带了Git,或者在你安装XCode(或者XCode的命令行工具)时,可能已经安装了 Git。 如果Mac还没有安装Git的话&…...
macOS本地调试k8s源码
目录 准备工作创建集群注意点1. kubeconfig未正常加载2. container runtime is not running3. The connection to the server 172.16.190.132:6443 was refused - did you specify the right host or port?4. 集群重置5.加入子节点 代码调试 准备工作 apple m1芯片 安装vmwa…...
JS 实现一键复制文本内容
1、演示: 2、代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>一键复制</title&g…...
【Linux】echo命令使用
echo命令 功能是在显示器上显示一段文字,一般起到一个提示的作用。此外,也可以直接在文件中写入要写的内容。也可以用于脚本编程时显示某一个变量的值,或者直接输出指定的字符串。 著者 由布莱恩福克斯和切特拉米撰写。 语法 echo […...
Day03 嵌入式---中断
目录 一、简单介绍 二、总体框架 三、NVIC 3.2 NVIC的寄存器 3.3 中断向量表 3.4 中断优先级 3.5 NVIC优先级分组 3.6 NVIC配置 3.6.1、设置中断分组 3.6.2、初始化 四、EXTI 外部中断 4.1.EXTI的基本概念 4.2.EXTI的⼯作原理 4.3 EXTI配置 五、SYSCFG 5.1 SYS…...
wpf devexpress 使用IDataErrorInfo实现input验证
此处下载源码 当form初始化显示,Register按钮应该启动和没有输入错误应该显示。如果用户点击注册按钮在特定的输入无效数据,form将显示输入错误和禁用的注册按钮。实现逻辑在标准的IDataErrorInfo接口。请查阅IDataErrorInfo接口(System.Com…...
shell_81.Linux在命令行中创建使用函数
在命令行中使用函数 在命令行中创建函数 两种方法 单行方式来定义函数: $ function divem { echo $[ $1 / $2 ]; } $ divem 100 5 20 $ 当你在命令行中定义函数时,必须在每个命令后面加个分号,这样 shell 就能知道哪里是命令的起止了&am…...
鱼香ROS一键安装命令(支持微信、docker、ros等)
按照指定的数字选择即可。 wget http://fishros.com/install -O fishros && . fishros小鱼的一键安装系列 [14个ROS版本任你选]一键安装Docker使用指南...
深入理解 Go 函数:从基础到高级
一、函数基础 1、函数定义 函数是组织好的、可重复使用的、用于执行指定任务的代码块Go 语言中支持:函数、匿名函数和闭包 package mainimport "fmt"func main(){ret : intSum(1,2)fmt.PrintIn(ret) //3 }func instSum(x,y int) int {return x y }…...
开启三层交换机DHCP服务
二层交换机上不需要配置任何东西,只需要在pc机上开启dhcp服务,配置好LSW1后就可以自动获取到IP地址。 sys Enter system view, return user view with CtrlZ. [Huawei]sys sw1 [sw1]dhcp enable Info: The operation may take a few seconds. Please wai…...
jspdf+html2canvas浏览器缩放问题
之前在弄页面导出为pdf的时候,jspdf配合html2canvas貌似很好用,我自己在使用的时候也没有觉得有什么问题,但是客户那边反馈说下载下来的pdf不全. 后来问了客户才发现客户的浏览器比例缩放到了125%;这就导致了pdf不全, 先看看原来的代码: download() {let jsPDF jspdf.jsPDF;l…...
西南科技大学模拟电子技术实验六(BJT电压串联负反馈放大电路)预习报告
一、计算/设计过程 BJT电压串联负反馈放大电路图1-1-1-1为BJT电压串联负反馈放大实验电路,若需稳定输出电压,减小从信号源所取电流,可引入电压串联负反馈闭合开关。 图1-1-1-1 理论算法公式(1)闭环电压放大倍数 (2)反馈系数 (3)输入电阻 (4)输出电阻 计算过程。开环…...
JS的监听事件
在JavaScript中,你可以使用监听器来捕获和处理不同类型的事件。通过添加事件监听器,你可以指定当特定事件发生时要执行的函数。 以下是几种常见的监听事件的方法: 1. addEventListener():用于在目标元素上添加事件监听器。它接受…...
JS Object.values()
一、官方定义 返回一个给定对象的自有可枚举字符串键属性值组成的数组 二、语法 Object.values(obj)参数 obj 被返回可枚举属性值的对象。返回值 一个包含对象自身的所有可枚举属性值的数组。描述 Object.values() 返回一个数组,其元素是在对象上找到的可枚举…...
基于Java SSM人力资源管理系统
人力资源管理系统实现对企业人力资源的科学管理。企业有多个部门,每个部门有——名经理和多名员工,公司设置多级岗位,对应不同薪酬标准,员工日常工作进行考勤,岗位变动需要进行登记。系统管理的对象及操作主要有&#…...
人工智能和程序员
一、介绍人工智能和程序员 人工智能(AI)是一种模拟人类智能的计算机系统,其目的是让计算机具备类似人类的学习、推理、规划和理解能力。人工智能致力于创建能够感知、适应环境并作出决策的智能体,以解决各种复杂的问题。程序员是…...
wordpress文档可以下载吗/十大免费excel网站
朱熹曰:“日省其身,有则改之,无则加勉。”孔子的学生曾子也经常主张:“吾日三省吾身”今天读了一些博客,对比最近博客很久未更新、github上也一直不见项目落地,着实烦躁、厌恶自己的懒惰、每天总是好像很忙的样子&…...
潍坊网站建设套餐/谷歌浏览器下载官方正版
大家都会用$(div)来获取div并对其进行一些操作,今天用到一个函数发现$(div)与getElementBy系列函数得到的对象并不一样。 然后去查了下,发现$(div)得到的是一个数组,而getElementBy系统函数得到的是数组中的一个对象 然后。。。。$(div)[0]就…...
网站可以做参考文献吗/咸阳网站建设公司
有人的地方就有江湖,有江湖的地方就有恩怨。软件测试也有自己的江湖,也有自己的纷争。软件测试江湖一直存在于武林中,只是对外行事低调,从不惹是非,是以未受到武林中各路人士的关注,直到近年来互联网这股势…...
湖北商城网站建设/百度竞价网站
https://zhidao.baidu.com/question/173351764.html 转载于:https://www.cnblogs.com/DixinFan/p/9219084.html...
网页升级访问未成年/绍兴seo排名外包
摘要: 最近做项目中遇到批量添加和修改的问题,在老大的指导下学会了使用表类型参数来做批量操作。为了巩固强化,围绕这个技术又做了个小demo。 开始正题: 首先,我们在SQL Server 2008下创建一个示例数据库名为Table…...
wordpress新手/百度竞价推广是什么工作
当下电子阅读逐渐流行,但多限于纯文字类网文小说阅读。市面上主流的电子书阅读器多为8英寸以下的小屏产品,很多都不能很好地解决大版面的PDF文件阅读舒适度的问题,更没法满足读者批注写笔记的需求。一直走大屏路线的BOOX电纸书,在…...