当前位置: 首页 > news >正文

【UCB CS61C】Lecture 5 - Floating Point

目录

  • 引入浮点数(Floating Point)
    • 定点表示法(Fixed-Point Model)
    • 科学记数法(Scientific Notation)
      • 记数法间的转换
  • IEEE 754 二进制浮点数算术标准
    • 实现目标
    • 单精度浮点编码
      • 阶码字段(The Exponent Field)
      • 尾数字段(The Significand Field)
    • 双精度浮点编码
    • 0 的表示
    • 无穷的表示
    • NaN 的表示
    • 极小值的表示
  • 浮点数的限制
  • 浮点数的转换
    • 比较与表达式转换
    • 浮点数转换为十进制
    • 科学记数法转换为浮点数

本文章系计算机体系结构课程 UCB CS61C: Great Ideas in Computer Architecture 的学习笔记。

引入浮点数(Floating Point)

  • 位(bits)只能表示 2 的非负幂;因此,在此种表示方式下,其所能表达的至少是一个整数,不可能是分数。

在这里插入图片描述

定点表示法(Fixed-Point Model)

  • 十进制下的小数点作为边界分割浮点数的整数与分数部分,可以很容易得知小数部分的每一位由以 10 为底的负数幂构成(例如,25.2406ten = 2 ⨉ 101 + 5 ⨉ 102 + 2 ⨉ 10-1 + 4 ⨉ 10-2 + 6 ⨉ 10-4
  • 推而广之,二进制下的小数点作为边界分割浮点数的非负幂与负数幂部分
    在这里插入图片描述
  • 在这种表示法中,随着精度的提高,所能表达的范围正急剧减小,我们将小数点固定在左边若干位数字,然而小数点不应该是完全固定的,它应该是任意的,为解决这一问题,我们引入科学记数法。

科学记数法(Scientific Notation)

  • 大致分为尾数significand)和阶码exponent)、基数(base)三大部分,可以通过阶码来更改小数点的位置(实际上二进制点是浮动的,因此也被称为浮点)。由于只允许小数点左边存在一位数字,我们通过规格化的科学记数法可以最大限度地利用有限的有效数字。

在这里插入图片描述

记数法间的转换

  • 对于 x.xxxxtwo ⨉ 2n ,若 n > 0 n > 0 n>0 则浮点向右移动 n n n 位,若 n < 0 n < 0 n<0 则浮点向左移动 n n n 位,转换为一般固定点数。
  • 一般固定点数转换为科学记数法的浮点数只需要逆向完成上述过程即可。

IEEE 754 二进制浮点数算术标准

实现目标

  • 适配于所有计算机的实数标准算术:计算机对于实数的表示是近似的,我们希望相同的浮点数表达式求值在任何计算机上可以获取到相同的结果。
  • 在较大的范围内保持尽可能高的精度。
  • 帮助解决实数算术中的错误:
    • + ∞ +\infty + − ∞ -\infty ,Not-A-Number(NaN),指数溢出(包括上溢和下溢)
  • 保证编码与二进制补码的兼容性。
    • 例如,浮点数中的 +0 与二进制补码中的 0 一致
    • 能够在不进行浮点比较(floating point comparison)的情况下排序

单精度浮点编码

对于以标准化科学记数法表示的二进制数 ± 1. x x x . . . x t w o × 2 y y y . . . y t w o \pm 1.xxx...x_{two} \times 2^{yyy...y} \ two ±1.xxx...xtwo×2yyy...y two

  • 将一个 32 位的字(word32-bit 可以存储 4 个字节)分割为 3 个区域:
    • 符号位sign):占用 1 位,1 为负,0 为正
    • 阶码exponent):占用 8 位,代表 y y y,对浮点数加权
    • 尾数significand):占用 23 位,代表 x x x

在这里插入图片描述

  • 二进制点本质上存储在阶码字段中;由于首部的 1 是固定的,我们不需要额外的区域来存储。

阶码字段(The Exponent Field)

  • 为了便于浮点数间的大小比较,我们在阶码中引入移码bias notation),当浮点数的实际值很小时,我们希望看起来也很小。在补码中,负数的补码表示是通过对其绝对值取反加一得到的,-1 的补码形式 11111111 看起来大于 0 的补码形式 00000000,所以这并不是一个好的选择;而移码则保留了值的线性关系the linearity of value)。
  • 对于若干个浮点数进行排序时,先查看符号位,正数将始终大于负数;随后查看阶码和尾数,二者如果具有相同的尾数,阶码越大浮点数本身越大,如果具有相同的阶码,则尾数越大浮点数本身越大。因而,我们基本上只需要使用无符号的比较
  • 在移码表示的指数值 e e e 满足实际指数值 E = e − b i a s E = e - bias E=ebias,阶码存在正负,引入偏置值 b i a s = 2 k − 1 − 1 bias = 2^{k - 1} - 1 bias=2k11,对于单精度浮点数来说, k = 8 k = 8 k=8,则 b i a s = 127 bias = 127 bias=127,因此,当移码取值范围 0(00000000two)~ 255(11111111two)时,实际的指数值取值范围 -127 ~ 128。
实际指数值移码十进制下的移码值
无穷大11111111255
12711111110254
210000001129
110000000128
00111111127
-10111110126
-20111101125
-126000000011
Denorms(无穷小)000000000

尾数字段(The Significand Field)

对于单精度浮点数,结构大致为 ( − 1 ) s × ( 1. S ) × 2 ( E − 127 ) (-1)^s \times (1.S) \times 2^{(E - 127)} (1)s×(1.S)×2(E127),其中 S S S 为尾数, E E E 为阶码:

  • ( 1. S ) (1.S) (1.S) 可以看作尾数的值 + 1。
  • 尾数表示所有 2 的负幂次,其总和总是小于 1.

在这里插入图片描述

双精度浮点编码

  • 与单精度相同的结构,存储数据的空间扩大为 64 位,其中:
    • 阶码占用扩大为 11 位
    • 尾数占用扩大为 52 位
    • 符号位占用保持不变
      在这里插入图片描述
  • C 声明变量类型为 double ;阶码的偏置值 b i a s = 2 10 − 1 = 1023 bias = 2^{10} -1 = 1023 bias=2101=1023,双精度意味着更高的精度,而非更大的范围。

0 的表示

  • 由于隐含的 1 的出现,对于标准编码,0x 00000000 实际上是 1.0 ⨉ 10-27 ≠ 0。
  • 特殊情况当阶码和尾数均为 0 时,这一数值是真正的 0.
  • 这意味着存在两个 0,基于数学的原因,我们希望知道一个数从符号位的正或负的一边趋近于 0.

在这里插入图片描述

无穷的表示

  • 无穷被视为一个数字,并且可以进行比较与算术运算,例如 x / 0 > y
  • 取最高阶码 255,尾数均为 0

在这里插入图片描述

NaN 的表示

我们现在有如下的情形:

移码尾数意义
00 ± \pm ± 0
0非 0
1-254任意值 ± \pm ± 浮点数
2550 ± ∞ \pm \infty ±
255非 0
  • 阶码为 255,而尾数不为 0,实际上并不是一个数字(NaN):
    • 0 0 \frac{0}{0} 00 − 4 \sqrt{-4} 4 ∞ − ∞ \infty - \infty 、……
    • 对于调试非常有帮助
    • NaN 与数字的运算的结果仍为 NaN
  • 取最高阶码 255,非零的尾数(可用于表示不同类型的 NaN

在这里插入图片描述

极小值的表示

  • 对于一个尽可能小的数字,符号位任取,阶码为最小值 1,尾数均为 0,即 a = 1.0...0 0 t w o × 2 1 − 127 = ( 1 + 0 ) × 2 − 126 = 2 − 126 . a = 1.0...00_{two} \times 2^{1 - 127} = (1+0) \times 2^{-126} = 2^{-126}. a=1.0...00two×21127=(1+0)×2126=2126.
  • 第二小的数字应为 b = 1.0...0 1 t w o × 2 1 − 127 = ( 1 + 2 − 23 ) × 2 − 126 = 2 − 126 + 2 − 149 . b = 1.0...01_{two} \times 2^{1 - 127} = (1+2^{-23}) \times 2^{-126} = 2^{-126} + 2^{-149}. b=1.0...01two×21127=(1+223)×2126=2126+2149.
  • 介于 0 和 a a a 之间的数字是最接近 0 的。

在这里插入图片描述

  • 0 到 a a a 的差值为 2 − 126 2^{-126} 2126 a a a b b b 的差值为 2 − 149 2^{-149} 2149;前者远远大于后者,这是因为隐含的 1 的存在。因此,我们需要通过表示 0 到 a a a 的差值以内的值来表示极小值。
  • 特殊情况:直接略去隐含的 1,当阶码等于 0 且尾数不为 0 时,即为非规格化数(denormalized numbers),所谓的尽可能接近于 0 的值。
  • 非规格化数不包含隐含的 1,隐含的阶码为 -126二进制点向前一位左移了一位,指数将会减少一位)。
  • 最小的非规格化数为 ± 0 . 00...0 1 t w o × 2 − 126 = ± 2 − 149 \pm\textbf{0}.00...01_{two} \times 2^{-126} = \pm 2^{-149} ±0.00...01two×2126=±2149
  • 最大的非规格化数为 ± 0 . 11...1 1 t w o × 2 − 126 = ± ( 2 − 126 − 2 − 149 ) \pm\textbf{0}.11...11_{two} \times 2^{-126} = \pm (2^{-126}-2^{-149}) ±0.11...11two×2126=±(21262149)

那么,所有数值的情形就完备了:

移码尾数意义
00 ± \pm ± 0
0非 0非规格化数
1-254任意值 ± \pm ± 浮点数
2550 ± ∞ \pm \infty ±
255非 0NaN

浮点数的限制

  • 上溢(overflow):阶码(指数值)大于所能表示的值, ∣ x ∣ > 2 128 . |x| > 2^{128}. x>2128.
  • 下溢(underflow):负阶码(指数值)大于所能表示的值, 0 < ∣ x ∣ < 2 − 149 . 0< |x| < 2^{-149}. 0<x<2149.

在这里插入图片描述

  • 当算术结果超出了尾数所能容纳的范围,四舍五入(rounding)会出现并可能导致未意料的结果。浮点数有着不同的四舍五入模式,但最常见的是四舍五入到最近第一个可表示的浮点数——若算术结果位于规格化数与非规格化数的空隙(gaps)内,我们需要找出最近的一个浮点数,以此来表示。
  • 空隙的宽度取决于阶码字段exponent fields),如图,保持尾数的位数一致,当我们改变阶码时,空隙也随之发生改变。因此,每个可表示的浮点数之间的空隙是随着指数的增加而增大的。具体原因是:
    • 标准化格式:随着数值的增大,指数位的值也会增加,而尾数的有效位数保持不变。
    • 相对精度:浮点数的精度是相对的,通常是依据其值的大小来决定的。相邻的浮点数之间的差距与它们的大小成比例。
    • 舍入误差:在浮点数运算过程中,可能会出现舍入误差,特别是在执行多次运算时,这些误差可能会累积。

在这里插入图片描述

  • 因此,0 附近浮点数的值分布更密集且向两边越来越分散

在这里插入图片描述

  • 更大的取值范围并不意味着更多的数字,我们在增加阶码大小的同时丧失了一定的精度。解决这一问题的方案是使用更多的位数,这便是双精度浮点数出现的意义,大幅提高了精度。
  • 浮点数的加法运算并不具有结合性associative),这一问题基于舍入误差,尾数只有 23 位精度的浮点数不得不对结果进行近似,这同时也意味着看似简单的浮点运算将会无法得出准确的结果。
  • 浮点数无法表示所有的整数。由于愈来愈宽的空隙,在某一点的空隙将会超过 1,从而无法完全表示所有整数。例如,对于 2 24 + 1 2^{24}+1 224+1,实际值为 16777217,然而浮点数将会返回 16777216。

浮点数的转换

比较与表达式转换

在这里插入图片描述

  • 1 = 1.0 × 2 0 1=1.0 \times 2^0 1=1.0×20 2 = 1.0 × 2 1 2=1.0 \times 2^1 2=1.0×21 3 = 11 1 t w o = 1.1 × 2 1 . 3=111_{two}=1.1\times2^1. 3=111two=1.1×21.
  • 1~2 之间有 23 位尾数空余, F P ( 1 , 2 ) = 2 23 FP(1,2)=2^{23} FP(1,2)=223;2~3 之间有一位被 1 占用, F P ( 2 , 3 ) = 2 22 . FP(2,3)=2^{22}. FP(2,3)=222.

在这里插入图片描述

  • 第一个条件是成立的。当我们将两个浮点数相乘时,阶码相加,尾数相乘,并且不存在溢出,所以两边是等价的。
  • 第二个条件是不成立的。右边的表达式中,Big + BigNeg = 0,加上 Tiny ,原式即为 Tiny ;而左边的表达式中,当我们尝试将一个较大的数字 Big 与一个较小的数字 Tiny 相加时,阶码不会改变,只改变尾数(有效位数)。 因此当我们将 2 60 2^{60} 260 2 − 15 2^{-15} 215 相加时,需要更改二进制点后 75 位的尾数( Big 至少是 Tiny 的 224 倍),然而尾数只有 23 位的长度,最终我们将不会添加任何内容。由此,左边的表达式将求值为 0.

浮点数转换为十进制

在这里插入图片描述

  1. 观察阶码字段,判断是否为非规格化数。上图所给出的表明其为规格化数(一般的浮点数)。
  2. 提取对应的信息,并代入科学记数法公式: ( − 1 ) s i g n × 1. s i g n i f i c a n d × 2 e x p o n e n t − 127 . (-1)^{sign} \times 1.significand \times 2^{exponent - 127}. (1)sign×1.significand×2exponent127. 由上图可知,sign = 0,exponent = 0b 0110 1000 = 26 + 25 + 23 = 104,而尾数 1.101 0101 0100 0011 0100 0010 = 1 + 2 − 1 + 2 − 3 + 2 − 5 + 2 − 9 + 2 − 14 + 2 − 15 + 2 − 17 + 2 − 22 = 1.666115 1.101 \ 0101 \ 0100 \ 0011 \ 0100 \ 0010=1+2^{-1}+2^{-3}+2^{-5}+2^{-9}+2^{-14}+2^{-15}+2^{-17}+2^{-22}= 1.666115 1.101 0101 0100 0011 0100 0010=1+21+23+25+29+214+215+217+222=1.666115,代入公式得 1.66115 × 2 104 − 127 = 1.66611 5 t e n × 2 − 23 ≈ 1.986 × 1 0 − 7 . 1.66115 \times 2^{104-127}=1.666115_{ten} \times 2^{-23} \approx 1.986 \times 10^{-7}. 1.66115×2104127=1.666115ten×2231.986×107.

科学记数法转换为浮点数

给出 − 2.340625 × 1 0 1 . -2.340625 \times 10^1. 2.340625×101.

  1. 去规格化:小数点右移一位,得到 -23.40625,这是为了便于将其转换为二进制形式的科学记数法。
  2. 将得到的去规格化形式的数分为整数和小数两大部分,分别转换:对于整数部分,23 = 16 + 4 + 2 + 1 = 10111two;对于小数部分,0.40625 = 0.25 + 0.125 + 0.03125 = 2-2 + 2-3 + 2-5 = 0.01101two.
  3. 将两个部分合并,同时进行规格化,即 10111.01101 = 1.011101101 ⨉ 24.
  4. 调整阶码偏差并转化为二进制。exponent = 4 + 127 = 131 = 10000011two ,则最终浮点数如下图:

在这里插入图片描述

神尾观铃

相关文章:

【UCB CS61C】Lecture 5 - Floating Point

目录 引入浮点数&#xff08;Floating Point&#xff09;定点表示法&#xff08;Fixed-Point Model&#xff09;科学记数法&#xff08;Scientific Notation&#xff09;记数法间的转换 IEEE 754 二进制浮点数算术标准实现目标单精度浮点编码阶码字段&#xff08;The Exponent …...

【Binlog实战】:基于Spring监听Binlog日志

【Binlog实战】&#xff1a;基于Spring监听Binlog日志 binlog的三种模式 MySQL 的二进制日志&#xff08;binlog&#xff09;有三种不同的格式&#xff0c;通常被称为 binlog 模式。这三种模式分别是 Statement 模式、Row 模式和Mixed 模式。 Statement 模式&#xff1a; 在 …...

鸿蒙OpenHarmony【轻量系统芯片移植】轻量系统STM32F407芯片移植案例

轻量系统STM32F407芯片移植案例 介绍基于STM32F407IGT6芯片在拓维信息[Niobe407]开发板上移植OpenHarmony LiteOS-M轻量系统&#xff0c;提供交通、工业领域开发板解决方案。移植架构采用Board与SoC分离方案&#xff0c;使用arm gcc工具链Newlib C库&#xff0c;实现了lwip、l…...

基于SpringBoot+定时任务实现地图上绘制车辆实时运动轨迹图

目录 1. 项目结构 2. Maven依赖配置 (pom.xml) 3. 实现后端服务 4. 配置文件 (application.properties) 5. 启动项目 6. 访问页面 实现基于北斗卫星的车辆定位和轨迹图的Maven工程&#xff08;使用模拟数据&#xff09;&#xff0c;我们将使用以下技术&#xff1a; Spri…...

Rasa对话模型——做一个语言助手

1、Rasa模型 1.1 模型介绍 Rasa是一个用于构建对话 AI 的开源框架&#xff0c;主要用于开发聊天机器人和语音助手。Rasa 提供了自然语言理解&#xff08;NLU&#xff09;和对话管理&#xff08;DM&#xff09;功能&#xff0c;使开发者能够创建智能、交互式的对话系统。 1.2…...

golang学习笔记19——golang做服务发现与注册的深度剖析

推荐学习文档 golang应用级os框架&#xff0c;欢迎stargolang应用级os框架使用案例&#xff0c;欢迎star案例&#xff1a;基于golang开发的一款超有个性的旅游计划app经历golang实战大纲golang优秀开发常用开源库汇总想学习更多golang知识&#xff0c;这里有免费的golang学习笔…...

ROS和ROS2借助智能大模型的学习和研究方法

机器人相关知识的本身和价值-CSDN博客 知识本身在智能时代毫无价值&#xff0c;需要基于知识应用和创新才有价值。 学历报废并非来自扩招&#xff0c;而是智能模型的快速发展。-CSDN blink-领先的开发者技术社区 2024年中秋&#xff0c;智能模型实力已经如此&#xff0c;但还…...

弹性负载均衡ELB 详解和设置方法

一、弹性负载均衡ELB 详解 1. 定义与概念 弹性负载均衡&#xff08;Elastic Load Balancing&#xff0c;简称ELB&#xff09;是一种将访问流量自动分发到多台云服务器的流量分发控制服务。它通过在多个后端服务器之间均衡分配请求&#xff0c;提高应用程序的可用性、可扩展性…...

Python3网络爬虫开发实战(15)Scrapy 框架的使用(第一版)

文章目录 一、Scrapy 框架介绍1.1 数据流1.2 项目结构1.3 Scrapy 入门 二、Selector 解析器2.1 XPath 和 CSS 选择器2.2 信息提取2.3 正则提取 三、Spider 的使用3.1 Spider 运行流程3.2 Spider 类分析3.3 Request3.4 Response 四、Download Middleware 的使用4.1 process_requ…...

大众点评代发排名骗局

大众点评代发排名骗局 不诋毁同行&#xff0c;不贬低对手&#xff0c;请各位老板擦亮眼睛&#xff0c;认真看完这篇文章&#xff0c;以防上当受骗#网络宣传&#xff03;企业推广&#xff03;企业推广 大众点评代发排名&#xff1a;一场精心编织的骗局 在这个美食如云的时代&…...

硬件基础知识

驱动开发分为&#xff1a;裸机驱动、linux驱动 嵌入式&#xff1a;以计算机技术为基础&#xff0c;软硬结合的、可移植、可剪裁的专用计算机 单片机最小单元&#xff1a;vcc gnd reset 晶振 cpu --- soc :system on chip 片上外设 所有的程序都是在soc&#xff08;cpu&…...

使用gitee如何回滚上一个版本,简单操作方式-gitee自带功能无需使用代码

使用gitee如何回滚上一个版本&#xff0c;简单操作方式-gitee自带功能无需使用代码&#xff0c;很多朋友使用代码的话容易出错&#xff0c;gitee自带了本功能&#xff1a; 找到gitee代码仓库&#xff0c;找到对应的想要回滚的版本点击进去 点击revert&#xff0c;选择自己对应的…...

独立站技能树之建站33项自检清单 1.0丨出海笔记

很多时候大家建好站之后很嗨&#xff0c;但过一会就开始担忧各种纠结我是不是还有什么点没做好&#xff0c;或者我的站漏了什么东西&#xff0c;那么接下来以下这个独立站自检清单能很好的帮到你。其实对于新手我还是建议大家直接用一些模板&#xff0c;因为模板上面基本该有的…...

js进阶-作用域是什么

经过前面80多篇文章对js相关内容的讲解&#xff0c;相信大家对js这门语言已经有了一定的知识储备&#xff0c;也掌握了这门语言的相关特性&#xff0c;领会到这门语言的魅力所在&#xff0c;所以从今天开始&#xff0c;会定期更新js进阶相关知识&#xff0c;大家可以持续关注&a…...

ant-design表格自动合并相同内容的单元格

表格自动合并相同内容的单元格 合并hooks import { TableColumnProps } from antdexport const useAutoMergeTableCell <T extends object>(dataSource: Array<T>,columns: Array<TableColumnProps> | Array<keyof T> ): Map<keyof T, Array<…...

通过多模态关系图学习实现可解释的医学图像视觉问答|文献速递--Transformer架构在医学影像分析中的应用

Title 题目 Interpretable medical image Visual Question Answering via multi-modal relationship graph learning 通过多模态关系图学习实现可解释的医学图像视觉问答。 01 文献速递介绍 医学视觉问答&#xff08;VQA&#xff09;是医学多模态大语言模型&#xff08;LL…...

从入门到精通,带你探索适合新手的视频剪辑工具

用视频来分享生活已经变成越来越多人的一种习惯&#xff0c;很多时候视频并不能一镜到底&#xff0c;所以还需要一些的修改、剪辑操作&#xff0c;那么这次我将介绍几款视频剪辑工具&#xff0c;希望能够让你分享的道路更加通畅。 1.FOXIT视频剪辑 连接直达>>https://w…...

线性规划------ + 案例 + Python源码求解(见文中)

目录 一、代数模型(Algebraic Models)详解1.1什么是代数模型?1.2代数模型的基本形式1.3 安装所需要的Python包--运行下述案例1.4代数模型的应用案例案例 1:市场供需平衡模型Python求解代码Python求解结果如下图:案例 2:运输问题中的线性规划模型进行数学建模分析1. 目标函…...

用Java实现人工智能

用Java实现人工智能 #Java #人工智能 #AI #机器学习 #深度学习 #数据科学 #技术博客 #编程技巧 文章目录 前言环境准备1. 安装Java2. IDE选择3. 依赖管理 数据准备模型训练模型评估分类模型评估回归模型评估模型的交叉验证 模型部署部署模型的基本步骤模型保存与加载Docker容器…...

MobaXterm使用技巧

引言 在现代IT环境中&#xff0c;远程管理和SSH连接已经成为管理员和开发者日常工作的重要组成部分。MobaXterm是一款功能强大的终端模拟器&#xff0c;它集成了多种网络工具&#xff0c;非常适合用于远程管理、编程和网络调试。本文将汇总一些MobaXterm的使用技巧&#xff0c…...

openstack中的rabbitmq

基本概念 基础介绍 exchange&#xff1a;用于分发信息&#xff0c;有direct、fanout、topic、headers&#xff1b; binding&#xff1a;exchange、queue之间的虚拟连接&#xff0c;由一个或者多个routing key组成&#xff1b; queues&#xff1a;用来暂存消息&#xff0c;供…...

etcd三节点,其中一个坏掉了的恢复办法

一、配置etcdctl环境变量 --------------------------------------------------------------------------------------------- #其中证书实际路径和endpoints,以环境情况为准,查询方式 # ps -ef | grep etcd-cafile # ps -ef | grep etcd-servers export ETCDCTL_API3 export…...

计算机毕业设计 基于SpringBoot框架的网上蛋糕销售系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…...

C编程控制PC蜂鸣器方法2

在《C编程控制PC蜂鸣器》一文中,我们了解并使用了通过IO端口控制的方式操作硬件,而有些时候这对于一些朋友来说太模糊了,很容易让人迷糊,这次采用最基本的write系统调用来写入input_event数据实现相同功能。这里涉及到的input_event可参考《C编程实现键盘LED闪烁方法2》一文…...

C# SQL 辅助工具

{/// <summary>/// sql 辅助工具/// </summary>public class SqlStructureHelps{#region 增删改查/// <summary>/// 截断/// </summary>/// <typeparam name"T"></typeparam>/// <returns></returns>public static …...

eNSP简单用法

建立一个简单的拓扑图 点击绿色三角开启设备 双击设备可以进行命令编辑 视图 分为三个视图&#xff1a;用户视图、系统视图、接口视图 用户视图 在默认模式下就是&#xff0c;为<huawei> 按ctrlz返回用户视图 系统视图&#xff1a; 在用户视图下输入sys切换&#…...

1035. 不相交的线

1. 题目 1035. 不相交的线 2. 解题思路 题目一看是求最值&#xff0c;那就可以考虑用DP来做。 核心点就是确定DP数组的含义以及状态转移方程&#xff1a; dp数组含义&#xff1a;dp[i][j]&#xff0c;nums1 前 i 个数和 nums2 前 j 个数的最大连线数dp[i][j] dp[i - 1][j …...

1.pytest基础知识(默认的测试用例的规则以及基础应用)

一、pytest单元测试框架 1&#xff09;什么是单元测试框架 单元测试是指再软件开发当中&#xff0c;针对软件的最小单位&#xff08;函数&#xff0c;方法&#xff09;进行正确性的检查测试。 2&#xff09;单元测试框架 java&#xff1a;junit和testing python&#xff1a;un…...

Linux常见查看文件命令

目录 一、cat 1.1. 查看文件内容 1.2. 创建文件 1.3. 追加内容到文件 1.4. 连接文件 1.5. 显示多个文件的内容 1.6. 使用管道 1.7. 查看文件的最后几行 1.8. 使用 -n 选项显示行号 1.9. 使用 -b 选项仅显示非空行的行号 二、tac 三、less 四、more 五、head 六、…...

初识 performance_schema:轻松掌握MySQL性能监控

什么是 performance_schema performance_schema 是 MySQL 5.8 版本的一个强大功能&#xff0c;它就像是一个内置的**“性能侦探”**&#xff0c;专门用来监控和分析 MySQL 服务器的资源消耗和等待情况。有了它&#xff0c;数据库管理员和开发者就能实时了解服务器的运行状态&a…...