【CSAPP】浮点数

news2024/11/24 14:57:18

文章目录

  • 小数表示
    • 练习1
    • 练习2
  • IEEE浮点表示
  • 数字示例
    • 练习1
    • 练习2
    • 练习3
  • 舍人
    • 练习1
    • 练习2
    • 练习3
  • 浮点运算
  • C语言中的浮点数
    • 练习1
    • 练习2

浮点数对形如 V = x ∗ 2 y V=x*2^y V=x2y的有理数进行编码。它对表示非常大的数( ∣ V ∣ > > 0 |V|>>0 V>>0)、非常接近 0的数( ∣ V ∣ < < 1 |V|<<1 V<<1),以及实数的 近似运算是很有用的。

小数表示

十进制表示小数
d m d m − 1 . . . d 1 d 0 . d − 1 d − 2 . . . d − n \begin{align} d_md_{m-1}...d_1d_0.d_{-1}d_{-2}...d_{-n} \end{align} dmdm1...d1d0.d1d2...dn
其中每个十进制数字 d i d_i di的取值范围是0 ~ 9,这个表达式所表示的值为:
d = ∑ i = − n m 1 0 i ∗ d i \begin{align} d=\sum_{i=-n}^{m}10^i*d_i \end{align} d=i=nm10idi
小数点左边的数字表示正幂,得到整数值;小数点右边的数字表示负幂,得到小数值。
小数点向移动1位表示d10除;小数点向移动1位表示d乘以10

类似地,二进制表示小数
b m b m − 1 . . . b 1 b 0 . b − 1 b − 2 . . . b − n \begin{align} b_mb_{m-1}...b_1b_0.b_{-1}b_{-2}...b_{-n} \end{align} bmbm1...b1b0.b1b2...bn
其中每个二进制数字(比特位) b i b_i bi的取值是01,这个表达式所表示的值为:
b = ∑ i = − n m 2 i ∗ b i \begin{align} b=\sum_{i=-n}^{m}2^i*b_i \end{align} b=i=nm2ibi
同理,小数点左边的数字表示正幂,得到整数值;小数点右边的数字表示负幂,得到小数值。
小数点向移动1位表示b2除;小数点向移动1位表示b乘以2

形如 0.11... 1 2 0.11...1_2 0.11...12的二进制数表示无限接近1的数。用 1.0 − ε 1.0 - \varepsilon 1.0ε表示。

仅使用有限长度的编码,十进制表示法不能表示像 1 3 、 5 7 \frac{1}{3}、\frac{5}{7} 3175这样的数,它只能表示那些能够被写成 x ∗ 1 0 y x*10^y x10y这样的数。同理,有限长度的二进制编码,只能表示那些能够被写成 x ∗ 2 y x*2^y x2y这样的数。其它的数只能被近似地表示,增加编码的长度可以提升精度。

练习1

填写下表中缺失的信息。

小数值二进制表示十进制表示
1 8 \frac{1}{8} 810.0010.125
3 4 \frac{3}{4} 430.110.75
25 16 \frac{25}{16} 16251.10011.5625
42 16 \frac{42}{16} 164210.10112.6875
9 8 \frac{9}{8} 891.0011.125
47 8 \frac{47}{8} 847101.1115.875
55 16 \frac{55}{16} 165511.00113.1875

练习2

十进制数0.1的二进制表示是一个无穷序列:
0.000110011 [ 0011 ] . . . 2 \begin{align} 0.000110011[0011]..._2 \end{align} 0.000110011[0011]...2
方括号里面的部分是无限重复的。

某系统内含一个时钟,类似一个计数器,每0.1秒加1。有一个变量x,该变量用24位二进制编码十进制数0.1x = 0.00011001100110011001100。程序用x乘以这个计数器的值,来以秒为单位确定时间。

  1. 0.1 - x的二进制表示是什么?
    0.000000000000000000000001100 [ 1100 ] . . . 2 0.000000000000000000000001100[1100]..._2 0.000000000000000000000001100[1100]...2
  2. 0.1 - x的近似的十进制值是多少?
    可以观察到,0.1的二进制表示可以写成 0.0001100 [ 1100 ] . . . 2 0.0001100[1100]..._2 0.0001100[1100]...2
    因此0.1 - x的近似值为 0.1 ∗ 2 − 20 0.1*2^{-20} 0.1220
  3. 计数器从0开始计数,实际时间100小时以后,程序计算出的时间和实际时间相差多少?
    实际时间100小时以后,计数器的值为:100 * 3600 * 10 = 3600000
    因此,程序计算出的时间和实际时间相差: 3600000 ∗ 0.1 ∗ 2 − 20 = 0.343 3600000 * 0.1 * 2^{-20} = 0.343 36000000.1220=0.343秒。
  4. 假设导弹的速率为2000米每秒,系统对导弹的位置预测偏差了多少?
    2000 * 0.343 = 687米。

IEEE浮点表示

前面谈到的定点表示法不能很有效地表示非常大的数。IEEE浮点标准用 V = ( − 1 ) s ∗ M ∗ 2 E V=(-1)^s*M*2^E V=(1)sM2E的形式表示一个数。

  1. 符号s = 1表示负数,s = 0表示正数。
  2. 尾数M是一个二进制小数,它的范围是 [ 1 , 2 − ε ] [1,2-\varepsilon] [1,2ε],或者 [ 0 , 1 − ε ] [0, 1-\varepsilon] [0,1ε] ε \varepsilon ε是很小的接近于0的正数。
  3. 阶数E的作用是对浮点数加权,这个权重是2E次幂(E可能是负数)。

将浮点数的位表示划分为三个部分,分别对这些值进行编码:

  1. 对符号位s的编码,占一个bit
  2. k位的阶码字段 e x p = e k − 1 . . . e 1 e 0 exp=e_{k-1}...e_1e_0 exp=ek1...e1e0编码阶数E
  3. n位的小数码字段 f r a c = f n − 1 . . . f 1 f 0 frac=f_{n-1}...f_1f_0 frac=fn1...f1f0编码尾数M

注意的区别和联系。的二进制表示,之间有一定的转换关系,这种关系是相关标准定义的。 数 → 码 数 \to 码 是编码, 码 → 数 码 \to 数 是解码。
使用阶码 e x p exp exp编码阶数E;使用小数码(或尾码 f r a c frac frac编码尾数M

在单精度浮点格式(C语言float)中,sexpfrac字段分别是1位、k = 8位和n = 23位,得到一个32位的表示。
在这里插入图片描述
在双精度浮点格式(C语言double)中,sexpfrac字段分别是1位、k = 11位和n = 52位,得到一个64位的表示。
在这里插入图片描述
给定表示,根据exp的值,被编码的值可以分成3种不同的情况:

情况1:规格化的值
exp字段既不是全0也不是全1

阶码字段被解释为以偏置量形式表示的有符号整数。阶数E的值是E = exp - bias,其中exp是无符号数,bias等于 2 k − 1 − 1 2^{k-1}-1 2k11(对于单精度bias = 127,对于双精度bias = 1023)。由此产生E的取值范围,对于单精度是-126 ~ +127,对于双精度是-1022 ~ +1023
小数码字段frac描述小数值f,其中 0 ≤ f < 1 0\le f <1 0f<1,其二进制表示为 0. f n − 1 . . . f 1 f 0 0.f_{n-1}...f_1f_0 0.fn1...f1f0。尾数M定义为M = 1 + f

情况2:非规格化的值
exp字段是全0
阶数E = 1 - bias,尾数M = f

定义阶数为1 - bias提供了一种从非规格化值平滑转换到规格化值的方法。

非规格化数有两个用途:
1)表示数值0。符号位是0,阶码字段是0,小数码字段是0,表示+0.0;符号位是1,阶码字段是0,小数码字段是0,表示-0.0。值+0.0-0.0在某些方面被认为是不同的,有些方面是相同的。
2)表示非常接近0.0的数。通过逐渐溢出,可能的数值分布均匀地接近于0.0

情况3:特殊值
exp字段是全1
无穷大frac字段是全0。当s = 0时是 + ∞ +\infty +,当s = 1时是 − ∞ -\infty 。无穷值表示计算溢出的结果,如两个很大的数相乘、除以零。
NaNfrac字段不全是0。当一些运算的结果不能是实数或者无穷时,结果就是NaN。如 − 1 \sqrt{-1} 1 ∞ − ∞ \infty - \infty

NaN的意思是Not a Number

数字示例

已知一种6位浮点格式:1位的符号位,k = 3位的阶码和n = 2位的小数码,偏置量 2 k − 1 − 1 = 3 2^{k-1}-1=3 2k11=3
下图展示了该浮点格式可表示的数的分布。规格化数值的最大绝对值是 ( 1 + 2 − 1 + 2 − 2 ) ∗ 2 6 − 3 = 14 (1+2^{-1}+2^{-2})*2^{6-3}=14 (1+21+22)263=14,规格化数值的最小绝对值是 1 ∗ 2 1 − 3 = 0.25 1*2^{1-3}=0.25 1213=0.25。非规格化数聚集在0附近,+0.0-0.0是特殊的非规格化数。那些可表示的数并不是均匀分布的,越靠近0越稠密
在这里插入图片描述
[-14, -0.25][0.25, 14]之间是规格化数,(-0.25, 0.25)之间是非规格化数。如果要表示绝对值大于14的数,就会溢出到 ∞ \infty

已知一种8位浮点格式:1位的符号位,k = 4位的阶码和n = 3位的小数码,偏置量 2 k − 1 − 1 = 7 2^{k-1}-1=7 2k11=7。下表所示它能表示的数值:

描述位表示指数小数
eE2^EfMM*2^EV十进制
00 0000 0000-61/6400000.0
最小的非零的
非规格化数
0 0000 0010-61/641/81/81/5121/5120.001953
0 0000 0100-61/642/82/82/5121/2560.003906
0 0000 0110-61/643/83/83/5123/5120.005859
...
最大的
非规格化数
0 0000 1110-61/647/87/87/5127/5120.013672
最小的
规格化数
0 0001 0001-61/6408/88/5121/640.015625
0 0001 0011-61/641/89/89/5129/5120.017578
...
0 0110 1106-11/26/814/814/167/80.875
0 0110 1116-11/27/815/815/1615/160.9375
10 0111 0007010/88/88/811.0
0 0111 0017011/89/89/89/81.125
0 0111 0107012/810/810/85/41.25
...
0 1110 1101471286/814/81792/8224224.0
最大的
规格化数
0 1110 1111471287/815/81920/8240240.0
无穷大0 1111 000+∞

可以观察到最大的非规格化数 7 512 \frac{7}{512} 5127和最小的规格化数 8 512 \frac{8}{512} 5128之间是平滑过渡的。
当要表示的数值超过最大的规格化数的时候,会溢出到 ∞ \infty

如果把浮点数中的位当作无符号整数编码看待,随着浮点数的增大,无符号数也是增大的。这么设计是为了使浮点数复用整数的比较和排序函数(对负数要特殊处理)。

单精度和双精度浮点数的表示范围如下表所示。

描述 e x p exp exp f r a c frac frac单精度双精度
000…000…000.00.0
最小的非零的非规格化数00…000…01 2 − 23 ∗ 2 − 126 = 1.4 ∗ 1 0 − 45 2^{-23}*2^{-126}=1.4*10^{-45} 2232126=1.41045 2 − 52 ∗ 2 − 1022 = 4.9 ∗ 1 0 − 324 2^{-52}*2^{-1022}=4.9*10^{-324} 25221022=4.910324
最大的非规格化数00…001…11 ( 1 − ε ) ∗ 2 − 126 = 1.2 ∗ 1 0 − 38 (1-\varepsilon)*2^{-126}=1.2*10^{-38} (1ε)2126=1.21038 ( 1 − ε ) ∗ 2 − 1022 = 2.2 ∗ 1 0 − 308 (1-\varepsilon)*2^{-1022}=2.2*10^{-308} (1ε)21022=2.210308
最小的规格化数00…010…00 1 ∗ 2 − 126 = 1.2 ∗ 1 0 − 38 1*2^{-126}=1.2*10^{-38} 12126=1.21038 1 ∗ 2 − 1022 = 2.2 ∗ 1 0 − 308 1*2^{-1022}=2.2*10^{-308} 121022=2.210308
101…110…00 1 ∗ 2 0 = 1.0 1*2^{0}=1.0 120=1.0 1 ∗ 2 0 = 1.0 1*2^{0}=1.0 120=1.0
最大的规格化数11…101…11 ( 2 − ε ) ∗ 2 127 = 3.4 ∗ 1 0 38 (2-\varepsilon)*2^{127}=3.4*10^{38} (2ε)2127=3.41038 ( 2 − ε ) ∗ 2 1023 = 1.8 ∗ 1 0 308 (2-\varepsilon)*2^{1023}=1.8*10^{308} (2ε)21023=1.810308

练习把整数值转换成浮点格式对理解浮点表示很有用。
如十进制数12345的二进制表示为[11000000111001],写作 1.1000000111001 ∗ 2 13 1.1000000111001*2^{13} 1.1000000111001213,用单精度k = 8n = 23bias = 127)的规格化数表示该值:
尾数部分是1.1000000111001,去掉整数部分的1,再在位补充0,得到小数码为[10000001110010000000000]
指数是13,加上偏置量,得到140,再在位补充0,得到阶码为[10001100]
再加上符号位0,最终得到结果[0 10001100 10000001110010000000000]
可以看到,无符号编码结果除了最高位的1,其余均作为了浮点格式的小数码部分。

练习1

假设有一种基于IEEE浮点格式的5位浮点表示:1个符号位、k = 2个阶码位、n = 2个小数码位,偏置量bias = 1
e:假定阶码字段是一个无符号整数所表示的值。
E:阶数。
2 E 2^E 2E:阶码的权重。
f:小数码字段表示的值。
M:尾数。
M ∗ 2 E M*2^E M2E:未归约的数值。
V:归约后的数值。
十进制:该数的十进制表示。
填写下表中的空白项。

eE 2 E 2^E 2EfM M ∗ 2 E M*2^E M2EV十进制
0 00 0000100000.0
0 00 01001 1 4 \frac{1}{4} 41 1 4 \frac{1}{4} 41 1 4 \frac{1}{4} 41 1 4 \frac{1}{4} 410.25
0 00 10001 1 2 \frac{1}{2} 21 1 2 \frac{1}{2} 21 1 2 \frac{1}{2} 21 1 2 \frac{1}{2} 210.5
0 00 11001 3 4 \frac{3}{4} 43 3 4 \frac{3}{4} 43 3 4 \frac{3}{4} 43 3 4 \frac{3}{4} 430.75
0 01 001010 4 4 \frac{4}{4} 44 4 4 \frac{4}{4} 44 4 4 \frac{4}{4} 441.0
0 01 01101 1 4 \frac{1}{4} 41 5 4 \frac{5}{4} 45 5 4 \frac{5}{4} 45 5 4 \frac{5}{4} 451.25
0 01 10101 1 2 \frac{1}{2} 21 3 2 \frac{3}{2} 23 3 2 \frac{3}{2} 23 3 2 \frac{3}{2} 231.5
0 01 11101 3 4 \frac{3}{4} 43 7 4 \frac{7}{4} 47 7 4 \frac{7}{4} 47 7 4 \frac{7}{4} 471.75
0 10 0021201222.0
0 10 01212 1 4 \frac{1}{4} 41 5 4 \frac{5}{4} 45 10 4 \frac{10}{4} 410 5 2 \frac{5}{2} 252.5
0 10 10212 1 2 \frac{1}{2} 21 3 2 \frac{3}{2} 23 6 2 \frac{6}{2} 2633.0
0 10 11212 3 4 \frac{3}{4} 43 7 4 \frac{7}{4} 47 14 4 \frac{14}{4} 414 7 2 \frac{7}{2} 273.5
0 11 00------ ∞ \infty -
0 11 01------NaN-
0 11 10------NaN-
0 11 11------NaN-

练习2

整数3510593的十六进制表示为0x00359141,单精度浮点数3510593.0的十六进制表示为0x4A564504。推导出这个浮点表示,并解释整数和浮点数表示之间的关系。

单精度浮点数的阶码有k = 8位,小数码有n = 23位,偏置量是127
整数3510593的二进制表示为0000 0000 0011 0101 1001 0001 0100 0001,写作 1.101011001000101000001 ∗ 2 21 1.1 0101 1001 0001 0100 0001 *2^{21} 1.101011001000101000001221。以单精度规格化数的表示方式,该数的小数码是1 0101 1001 0001 0100 0001 00。阶码是21 + 127 = 148的无符号二进制表示,即1001 0100。符号位是0

因此单精度浮点数3510593.0的二进制表示为0 1001 0100 1 0101 1001 0001 0100 0001 00,即0100 1010 0101 0110 0100 0101 0000 0100,十六进制表示为0x4A564504

整数的二进制表示中,除了最高位的1,其余部分与浮点数的小数码的有效位一一对应。

练习3

  1. 对于一种具有n位小数的浮点格式,给出不能准确描述的最小正整数的公式。假设阶码字段k足够大。
    正整数肯定是规格化数。
    n + 1位小数能表示的最小的小数码是0...011前面n0,因此尾数 M = 1 + 2 − ( n + 1 ) M=1+2^{-(n+1)} M=1+2(n+1),以此为尾数的最小正整数是 ( 1 + 2 − ( n + 1 ) ) ∗ 2 ( n + 1 ) = 2 ( n + 1 ) + 1 (1+2^{-(n+1)})*2^{(n+1)}=2^{(n+1)}+1 (1+2(n+1))2(n+1)=2(n+1)+1
  2. 对于单精度格式k = 23,这个整数的数值是多少?
    2 ( n + 1 ) + 1 = 2 ( 23 + 1 ) + 1 = 16 , 777 , 217 2^{(n+1)}+1=2^{(23+1)}+1=16,777,217 2(n+1)+1=2(23+1)+1=16,777,217

舍人

因为表示方法限制了浮点数的范围和精度,所以浮点运算只能近似地表示实数运算。因此,对于值x,我们期待能够找到与它“最接近”的能用浮点形式表示的匹配值 x ′ x' x,这就是舍入运算的任务。

IEEE浮点格式定义了4种不同的舍入方式:向偶数舍入向零舍入向下舍入向上舍入
向偶数舍入也被称为向最接近的值舍入,是默认的方式。如果某个值距离向上舍入值和向下舍入值相等它将向上或者向下舍入,使得结果的最低有效位数字是偶数
向零舍入把正数向下舍入,负数向上舍入。向下舍入得到 x − x^- x向上舍入得到 x + x^+ x+

方式1.401.601.502.50-1.50
向偶数舍入1222-2
向零舍入1112-1
向下舍入1112-2
向上舍入2223-1

相比于其他3种舍入方式,向偶数舍入可以优化对大量数据的统计偏差:当某些值距离其向上舍入值和向下舍入值相等,理论上会有50%的数据向上舍入,50%的数据向下舍入。

练习1

将下列2进制小数舍入到最接近的二分之一(小数点后一位)。

  1. 10.01 0 2 10.010_2 10.0102
    10. 0 2 10.0_2 10.02
  2. 10.01 1 2 10.011_2 10.0112
    10. 1 2 10.1_2 10.12
  3. 10.11 0 2 10.110_2 10.1102
    11. 0 2 11.0_2 11.02
  4. 11.00 1 2 11.001_2 11.0012
    11. 0 2 11.0_2 11.02

练习2

飞毛腿导弹软件把0.1的近似表示为 0.0001100110011001100110 0 2 0.00011001100110011001100_2 0.000110011001100110011002,假设使用IEEE舍入到偶数方式来确定0.1的二进制小数点右边23位的近似表示 x ′ x' x

  1. x ′ x' x的二进制表示是什么?
    0.0001100110011001100110 1 2 0.00011001100110011001101_2 0.000110011001100110011012
  2. x ′ − 0.1 x'-0.1 x0.1的十进制表示的近似值是什么?
    0.1的二进制表示是 0.0001100 [ 1100 ] . . . 2 0.0001100[1100]..._2 0.0001100[1100]...2,因此 x ′ − 0.1 x'-0.1 x0.1的二进制表示是 0.00000000000000000000000001100 [ 1100 ] 2 0.00000000000000000000000001100[1100]_2 0.00000000000000000000000001100[1100]2,其值为 0.1 ∗ 2 − 22 0.1*2^{-22} 0.1222
  3. 运行100小时后,计算时钟会有多少偏差?
    100 ∗ 3600 ∗ 10 ∗ 0.1 ∗ 2 − 22 = 0.0858306884765625 100 * 3600 * 10 *0.1*2^{-22}=0.0858306884765625 1003600100.1222=0.0858306884765625
  4. 该程序对导弹位置的预测有多大偏差?
    0.0858306884765625 ∗ 2000 = 171.661376953125 0.0858306884765625*2000=171.661376953125 0.08583068847656252000=171.661376953125

练习3

考虑下列基于IEEE浮点格式的7位浮点表示,均没有符号位。

  1. 格式A
    k=3个阶码位,阶码的偏置量是3
    n=4个小数位。
  2. 格式B
    k=4个阶码位,阶码的偏置量是7
    n=3个小数位。

填写下表,必要时使用向偶数舍入的原则。

格式A格式B
011 000010111 0001
101 111015/21001 11115/2
010 100125/320110 1003/4
110 111131/21011 00016
000 00011/640001 0001/64

浮点运算

对于实数xy,我们定义 x + f y = R o u n d ( x + y ) x+^fy=Round(x+y) x+fy=Round(x+y)Round是舍入的意思。
大多数值在浮点加法下都有逆元: x + f − x = 0 x+^f-x=0 x+fx=0。浮点加法满足交换律 x + f y = y + f x x+^fy=y+^fx x+fy=y+fx;但不满足结合律 ( 3.14 + 1 e 10 ) − 1 e 10 = 0 (3.14+1e10)-1e10=0 (3.14+1e10)1e10=0 3.14 + ( 1 e 10 − 1 e 10 ) = 3.14 3.14+(1e10-1e10)=3.14 3.14+(1e101e10)=3.14。浮点加法满足单调性:对于任何的abx(除了NaN),如果 a ≥ b a\ge b ab,那么 a + x ≥ b + x a+x\ge b+x a+xb+x,无符号和补码加法没有这个属性。

浮点乘法满足交换律单调性;不满足结合律分配律

编译器优化代码时,倾向于保守,避免任何对功能产生影响的优化,即使是很轻微的影响。

C语言中的浮点数

所有的C语言版本提供了2种不同的浮点数据类型:单精度的float、双精度的double。使用向偶数舍入的舍入方式。

C语言标准不要求机器使用IEEE浮点,所以没有标准的方法改变舍入方式,得到-0、无穷大值、NaN之类的特殊值。GNU编译器GCC在头文件math.h里定义了程序常数INFINITY表示 + ∞ +\infty +,定义了NaN表示非数值。

双精度所能表示的最大的有限数,大约是 1.8 ∗ 1 0 308 1.8*10^{308} 1.810308

当在int4字节)、float4字节)、double8字节)格式之间进行强制类型转换时,原则如下:

  1. int转换成float,不会溢出,但可能被舍入。
  2. intfloat转成double,因为double有更大的表示范围和表示精度,所以能保留精确的数值。
  3. double转成float,可能被溢出,也可能被舍入。
  4. floatdouble转成int,值会向零舍入,也可能溢出,溢出值依系统架构而不同。

练习1

完成下列宏定义。

  1. #define POS_INFINITY
    #define POS_INFINITY INFINITY
  2. #define NEG_INFINITY
    #define NEG_INFINITY -POS_INFINITY
  3. #define NEG_ZERO
    #define NEG_ZERO (-1.0 / POS_INFINITY)

练习2

假定变量xfd的类型分别是intfloatdouble。除了fd都不能等于 − ∞ -\infty + ∞ +\infty +或者NaN,它们的值是任意的。对于下面的每个C表达式,证明它总是,或者给出它为的情况。

  1. x == (int)(double)x
    真。double能准确表示int
  2. x == (int)(float)x
    x的有效位大于24时,结果为假。
  3. d == (double)(float)d
    d的小数码位大于23时,float就不能准确地表示d
  4. f == (float)(double)f
    真。double能准确表示float
  5. f == -(-f)
    真。只有符号位变动,没有阶码和小数码变动。
  6. 1.0 / 2 == 1 / 2.0
    真。都是double类型。
  7. d * d >= 0.0
    真。即便结果是 + ∞ +\infty +,只要 d ≠ N a N d\ne NaN d=NaN,就一定存在 d ∗ d > = 0.0 d * d>= 0.0 dd>=0.0
  8. (f + d) - f == d
    左边可能溢出,表达式为假。

由于编码的长度有限,与真实的整数和实数运算相比,计算机运算具有非常不同的属性。当超出表示范围时,会引起数值的截断或溢出。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/385600.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

单链表详解

单链表一.概念二.一些类型的创建三.尾插四.头插五.头删尾删六.打印链表七.单链表查找,任意位置插入&#xff0c;任意位置删除八.源代码一.概念 该篇链表博客是按照工程项目的格式来记录的&#xff0c;与平常的算法链表有些许不同&#xff0c;注意区分。 二.一些类型的创建 三.尾…

Hbuilder+uniapp 从零开始创建一个小程序

当你看到这篇博客的时候&#xff0c;那~说明~我的这篇博客写完了……哈哈哈哈哈哈哈哈。好的&#xff0c;清耐心往下看哈。如果有需要的&#xff0c;可以关注一下小作&#xff0c;后面还有小程序的云开发嗷~一、申请一个小程序账号&#xff08;已经有账号的小可爱可以跳过&…

CEC2020:鱼鹰优化算法(Osprey optimization algorithm,OOA)求解CEC2020(提供MATLAB代码

一、鱼鹰优化算法简介 鱼鹰优化算法&#xff08;Osprey optimization algorithm&#xff0c;OOA&#xff09;由Mohammad Dehghani 和 Pavel Trojovsk于2023年提出&#xff0c;其模拟鱼鹰的捕食行为。 鱼鹰是鹰形目、鹗科、鹗属的仅有的一种中型猛禽。雌雄相似。体长51-64厘米…

巾帼绽芬芳 一起向未来(中篇)

编者按&#xff1a;为了隆重纪念纪念“三八”国际妇女节113周年&#xff0c;快来与你全方位、多层次分享交流“三八”国际妇女节的前世今生。分上篇&#xff08;节日简介、节日发展和节日意义&#xff09;、中篇&#xff08;节日活动宗旨和世界各国庆祝方式&#xff09;和下篇&…

mybatis的增删改查运用

目录 一、总览图 二、运用 一、总览图 代码总览图 数据库总览图 二、运用 数据库的一张表对应一个封装类&#xff0c;一个mapper接口&#xff0c;一个mapper.xml文件&#xff0c; 一个实现类。表中的增删改查都在里面编写 但是配置xml文件整个数据库只要一个就好了 1.…

路由器与交换机的区别(基础知识)

文章目录交换机路由器路由器和交换机的区别&#xff08;1&#xff09;工作层次不同&#xff08;2&#xff09;数据转发所依据的对象不同&#xff08;3&#xff09;传统的交换机只能分割冲突域&#xff0c;不能分割广播域&#xff1b;而路由器可以分割广播域&#xff08;4&#…

软件大战升级,通用汽车与Qt达成合作,增强车内体验

从智能汽车产业现状来看&#xff0c;围绕软件而展开的争夺战已经打响。 英伟达首席执行官黄仁勋曾预测&#xff0c;未来四年内新车以成本价销售将不再是“天方夜谭”&#xff0c;因为利润将来自软件。 比如&#xff0c;英伟达与奔驰的合作&#xff0c;就将首次采用功能订阅的…

docker安装及命令使用

目录 1. Docker版本介绍 2. 创建Docker存储库 3. 安装docker软件包 4. Docker命令补全 6.Docker命令介绍 7. Docker镜像管理 7.1 列出本地镜像 7.2 搜索镜像 7.3 下载镜像 7.4 查看镜像 7.5 删除镜像 7.6 导出镜像 7.7 导入镜像 7.8 镜像改名 8. 容器管理 8.1 容…

再学C语言41:变长数组(VLA)

处理二维数组的函数&#xff1a;数组的行可以在函数调用时传递&#xff0c;但是数组的列只能被预置在函数内部 示例代码&#xff1a; #define COLS 4 int sum(int arr[][COLS], int rows) {int r;int c;int temp 0;for(r 0; r < rows; r){for(c 0; c < COLS; c){tem…

每个Android开发都应需知的性能指标~

无论你是发布一个新的 Android 应用&#xff0c;还是希望提高现有应用的性能&#xff0c;你都可以使用 Android 应用性能指标来帮助你。 在这篇文章中&#xff0c;我将解释什么是 Android 应用性能指标&#xff0c;并列出8个需要考虑跟踪的维度和建议的基线。 什么是 Android…

【LEAP模型】能源环境发展、碳排放建模

本次内容突出与实例结合&#xff0c;紧密结合国家能源统计制度及《省级温室气体排放编制指南》&#xff0c;深入浅出地介绍针对不同级别研究对象时如何根据数据结构、可获取性、研究目的&#xff0c;构建合适的能源生产、转换、消费、温室气体排放&#xff08;以碳排放为主&…

【NLP相关】深度学习领域不同编程IDE对比

❤️觉得内容不错的话&#xff0c;欢迎点赞收藏加关注&#x1f60a;&#x1f60a;&#x1f60a;&#xff0c;后续会继续输入更多优质内容❤️&#x1f449;有问题欢迎大家加关注私戳或者评论&#xff08;包括但不限于NLP算法相关&#xff0c;linux学习相关&#xff0c;读研读博…

死锁相关介绍【内含哲学家就餐问题】

死锁 死锁是这样一种情形&#xff1a;多个线程同时被阻塞&#xff0c;它们中的一个或者全部都在等待某个资源被释放。由于线程被无限期地阻塞&#xff0c;因此程序不可能正常终止。 场景1&#xff1a;一个线程&#xff0c;一把锁 一个线程&#xff0c;一把锁&#xff0c;线程…

【Linux】孤儿进程

在Linux中&#xff0c;如果子进程运行时&#xff0c;父进程因为某些原因先行终止&#xff0c;就称该子进程为孤儿进程。 我们编写如下代码&#xff1a; 子进程一直在运行&#xff0c;父进程运行一段时间后自动终止。运行该程序观察现象&#xff1a; 最开始时&#xff0c;子进程…

Unity 命令行发Android包

unity.exe 只允许存在一个 如果开了ide 或者之前的没关掉 就不能运行了 C: cd C:\Program Files\Unity\Editor\2021.3.6f1c1\Editor\ Unity.exe ^ -quit ^ -batchmode ^ -projectPath E:\puerts\UnityJenkins ^ -executeMethod Main.BuildC#代码放到任意Editor目录里 using S…

【linux】进程信号——信号的产生

进程信号一、信号概念1.1 信号理解二、产生信号2.1 通过键盘产生信号2.2 捕捉信号自定义signal2.3 系统调用接口产生信号2.3.1 向任意进程发送任意信号kill2.3.2 给自己发送任意信号raise2.3.3 给自己发送指定信号abort2.3.4 理解2.4 硬件异常产生信号2.4.1 除0异常2.4.2 野指针…

ACM-大一训练第三周(Floyd算法+并查集算法专题训练)

&#x1f680;write in front&#x1f680; &#x1f4dd;个人主页&#xff1a;认真写博客的夏目浅石.CSDN &#x1f381;欢迎各位→点赞&#x1f44d; 收藏⭐️ 留言&#x1f4dd;​ &#x1f4e3;系列专栏&#xff1a;ACM周训练题目合集.CSDN &#x1f4ac;总结&#xff1a…

五、Bean的作用域

1 singleton 默认情况下&#xff0c;Spring的IoC容器创建的Bean对象是单例的。测试&#xff1a; package com.power.spring6.bean;public class SpringBean {public SpringBean() {System.out.println("无参数构造方法执行了");} }<?xml version"1.0"…

Ubuntu中使用Synaptic进行包管理

Synaptic概况 Synaptic 是一个轻量级的 apt 软件包管理器系统的 GUI 前端&#xff0c;所有你可以在终端中使用 apt-get 命令来做的事&#xff0c;都可以通过 Synaptic 来实现。优势 图形化安装界面&#xff0c;同时可以安装配置相关依赖&#xff0c;避免由于依赖问题导致的各类…

【c++】2023杭州月薪个税计算(chatGPT帮忙加注释)

参考信息 杭州市的个人所得税起征点是每月5000元。 个人所得税税率标准&#xff1a; 1、工资范围在1-5000元之间的&#xff0c;包括5000元&#xff0c;适用个人所得税税率为0%; 2、工资范围在5000-8000元之间的&#xff0c;包括8000元&#xff0c;适用个人所得税税率为3%; 3、工…