让一个类成为另一个类的属性

‘一、建立子类 CAddress.cls
Private m_Street As String
Private m_City As String

Public Property Get Street() As String
Street = m_Street
End Property

Public Property Let Street(ByVal sStreet As String)
m_Street = sStreet
End Property

Public Property Get City() As String
City = m_City
End Property

Public Property Let City(ByVal sCity As String)
m_City = sCity
End Property

‘ 二、建立父类 CPerson.cls
Private m_Address As CAddress ‘ 声明 CAddress 类型的私有变量

‘ 自动初始化 CAddress 实例
Private Sub Class_Initialize()
Set m_Address = New CAddress
End Sub

‘ 清理资源
Private Sub Class_Terminate()
Set m_Address = Nothing
End Sub

‘ 通过 Property Get 公开 CAddress 实例
Public Property Get Address() As CAddress
Set Address = m_Address
End Property

‘ 可选:允许外部设置 CAddress 实例
Public Property Set Address(ByVal objAddress As CAddress)
Set m_Address = objAddress
End Property

‘ 三、在窗体或模块中使用:
Dim person As CPerson
Set person = New CPerson

‘ 设置地址属性
With person.Address
.Street = “123 Main St”
.City = “New York”
End With

‘ 读取地址属性
MsgBox “地址:” & person.Address.Street & “, ” & person.Address.City

‘四、注意事项

Set person.Address = New CAddress ‘ 正确
person.Address = New CAddress ‘ 错误(缺少 Set)

建立类模块

‘ 一、类模块代码

‘ 类名: clsWire
‘ 包含8个参数、2个方法、1个事件

Option Explicit

‘ —————————-
‘ 1. 定义私有变量(8个参数)
‘ —————————-
Private pMaterial As String ‘ 材料
Private pLength As Double ‘ 长度
Private pDiameter As Double ‘ 直径
Private pVoltage As Double ‘ 电压
Private pCurrent As Double ‘ 电流
Private pResistance As Double ‘ 电阻
Private pTemperature As Double ‘ 温度
Private pIsInsulated As Boolean ‘ 是否有绝缘层

‘ —————————-
‘ 2. 定义事件
‘ —————————-
Event StatusChanged(ByVal Message As String)

‘ —————————-
‘ 类初始化(设置默认值)
‘ —————————-
Private Sub Class_Initialize()
pMaterial = “Copper” ‘ 默认材料为铜
pLength = 0
pDiameter = 0
pVoltage = 0
pCurrent = 0
pResistance = 0
pTemperature = 25 ‘ 默认温度25°C
pIsInsulated = False
End Sub

‘ —————————-
‘ 属性定义(8个参数)
‘ —————————-
Public Property Get Material() As String
Material = pMaterial
End Property
Public Property Let Material(ByVal Value As String)
pMaterial = Value
End Property

Public Property Get Length() As Double
Length = pLength
End Property
Public Property Let Length(ByVal Value As Double)
pLength = Value
End Property

Public Property Get Diameter() As Double
Diameter = pDiameter
End Property
Public Property Let Diameter(ByVal Value As Double)
pDiameter = Value
End Property

Public Property Get Voltage() As Double
Voltage = pVoltage
End Property
Public Property Let Voltage(ByVal Value As Double)
pVoltage = Value
End Property

Public Property Get Current() As Double
Current = pCurrent
End Property
Public Property Let Current(ByVal Value As Double)
pCurrent = Value
End Property

Public Property Get Resistance() As Double
Resistance = pResistance
End Property
Public Property Let Resistance(ByVal Value As Double)
pResistance = Value
End Property

Public Property Get Temperature() As Double
Temperature = pTemperature
End Property
Public Property Let Temperature(ByVal Value As Double)
pTemperature = Value
End Property

Public Property Get IsInsulated() As Boolean
IsInsulated = pIsInsulated
End Property
Public Property Let IsInsulated(ByVal Value As Boolean)
pIsInsulated = Value
End Property

‘ —————————-
‘ 方法1:计算功率
‘ —————————-
Public Function CalculatePower() As Double
CalculatePower = pVoltage * pCurrent ‘ P = V * I
RaiseEvent StatusChanged(“功率计算完成: ” & CalculatePower & “W”)
End Function

‘ —————————-
‘ 方法2:检查安全性
‘ —————————-
Public Sub CheckSafety()
Dim msg As String
If pTemperature > 80 Then
msg = “警告:温度过高(” & pTemperature & “°C)!”
ElseIf pCurrent > 10 Then
msg = “警告:电流超过安全阈值!”
Else
msg = “系统状态正常”
End If
RaiseEvent StatusChanged(msg) ‘ 触发事件
End Sub

‘ 二、调用

‘ 在窗体代码中:
Dim WithEvents myWire As clsWire ‘ 必须使用 WithEvents 捕获事件

Private Sub Form_Load()
Set myWire = New clsWire
myWire.Voltage = 220
myWire.Current = 5
myWire.Temperature = 75

‘ 调用方法
Debug.Print “功率:” & myWire.CalculatePower()
myWire.CheckSafety

End Sub

‘ 处理事件
Private Sub myWire_StatusChanged(ByVal Message As String)
MsgBox Message, vbInformation, “导线状态”
End Sub

智算中心

在数字化时代,人工智能(AI)正深刻改变着我们的生活和工作。而智算中心作为支撑人工智能发展的核心基础设施,也逐渐走进大众视野。那么,智算中心究竟是什么?它如何工作?又对我们有什么用呢?

一、智算中心是什么?

智算中心,全称智能计算中心,是一个专门为人工智能应用提供强大计算能力和数据存储的基础设施。简单来说,它就像一个超级强大的“大脑”,能够处理海量的数据和复杂的计算任务,为各种人工智能应用提供支持。

智算中心的核心目标是将算力(计算能力)像水电一样,变成一种可按需获取的公共资源。无论是政府、企业还是普通用户,都可以根据自己的需求,使用智算中心提供的算力、数据和算法服务,从而推动人工智能技术在各个领域的应用。

二、智算中心有哪些关键组成部分?

■ 硬件设施

1、高性能计算硬件

智算中心的核心是强大的服务器集群,这些服务器通常配备先进的处理器,如 GPU(图形处理器)、FPGA(现场可编程门阵列)和 ASIC(专用集成电路)等。这些处理器擅长并行计算,能够快速处理大规模的计算任务。

2、高速存储设备

包括固态硬盘(SSD)和高速内存,确保数据能够快速读取和写入,满足人工智能算法对数据的高吞吐量需求。

3、高速网络连接

智算中心内部采用低延迟的高速网络架构,如 InfiniBand 或以太网等,确保数据在服务器之间的快速传输,减少计算过程中的延迟。

■ 软件与算法

1、AI 大模型

这些是利用大量数据训练而成的超大规模智能模型,具有更强的泛化能力和广泛的应用场景。比如语言大模型可以用于文本生成、翻译、问答等自然语言处理任务;视觉大模型则专注于图像分类、目标检测、视频理解等计算机视觉任务。

2、分布式计算框架

如 TensorFlow 和 PyTorch 等框架,主要用于构建和训练大规模深度学习模型。它们提供易于使用的编程接口,并具备支持分布式训练的能力。

3、智算操作系统

智算中心的“神经中枢”,负责对算力资源池进行高效管理和智能调度。它通过基础设施层、平台服务层和业务系统层的协同工作,为用户提供多元化、高质量的智算服务。

三、智算中心如何工作?

智算中心的工作可以分为几个关键环节:算力生产、算力聚合、算力调度和算力释放。

1. 算力生

智算中心通过高性能的硬件设备,如GPU集群,生产强大的计算能力。

2. 算力聚合

这些分散的计算能力被整合成一个强大的资源池。

3. 算力调度

智算中心的操作系统会根据用户的需求,智能地分配这些算力资源。

4. 算力释放

最终,这些算力以服务的形式提供给用户,支持各种人工智能应用。

四、智算中心有什么作用?

智算中心的作用非常广泛。它不仅可以加速人工智能算法的训练,还能为各种行业提供智能化支持。例如:

1、加速人工智能算法的训练

智算中心强大的算力可以大大缩短人工智能模型的训练时间。例如,训练一个复杂的深度学习模型可能需要数周甚至数月的时间,但在智算中心的支持下,这个时间可以大幅缩短。

2、推动产业智能化升级

智算中心为各行业提供算力、数据和算法服务,助力传统产业的智能化转型。比如在制造业中,通过智算中心的算力支持,可以实现生产过程的智能优化,提高生产效率和产品质量。

3、促进人工智能技术的普及

智算中心通过提供预置行业算法、构建预训练大模型等方式,降低了人工智能应用的开发门槛。即使是技术小白,也可以通过低代码甚至无代码开发的模式,快速实现人工智能应用的开发。

五、智算中心的发展现状与趋势

1. 建设加速

2024年,智算中心相关项目呈现加速趋势。仅2024年前7个月,国内智算中心相关中标公告已超140个。这表明智算中心的市场需求正在快速增长。

2. 技术演进

智算中心的发展基于最新人工智能理论和领先的人工智能计算架构。未来,智算中心将朝着多元融合型架构发展,通过硬件重构和软件定义,实现资源池化和高效管理。

六、如何接触智算中心?

1、使用云服务

许多云服务提供商已经开始提供智算中心的相关服务。可以通过这些平台,使用智算中心的算力和算法资源,进行人工智能应用的开发。

2、参与开源项目

一些开源的人工智能项目也与智算中心相关。可以通过参与这些项目,学习智算中心的相关技术和应用。

智算中心作为人工智能时代的基础设施,正在成为推动社会智能化转型的重要力量。它通过强大的硬件和先进的软件系统,为用户提供高效、便捷的算力和算法服务。未来,随着技术的不断进步,智算中心将发挥更大的作用,让我们拭目以待吧!

浮点数运算

浮点数的加法和减法运算是计算机中最常见也是最复杂的运算之一。由于浮点数的内部表示由符号(Sign)、指数(Exponent)和尾数(Mantissa)三部分组成,浮点数的加减法运算必须处理这些部分之间的复杂关系。以下是浮点数相加或相减的详细运算步骤:

1. 浮点数表示的回顾

  • 符号位(Sign):表示浮点数的正负。
  • 指数位(Exponent):表示浮点数的指数部分,经过偏移量调整(即偏置)。
  • 尾数位(Mantissa):表示浮点数的有效数字,通常以二进制形式表示。

2. 浮点数相加/相减的步骤

2.1 对阶操作(Aligning the Exponents)

  • 首先比较两个浮点数的指数部分。如果指数不相同,则需要对它们进行对齐:
    • 将较小指数的那个浮点数的尾数右移,并相应地增加它的指数,直到两个浮点数的指数相同。
    • 右移操作可能会导致尾数的精度损失,但这是必须的以便能够对两个数进行相加或相减。

例如,如果两个浮点数分别为 (2.5 \times 10^3) 和 (3.75 \times 10^2),需要将 (3.75 \times 10^2) 转换为 (0.375 \times 10^3) 以便与 (2.5 \times 10^3) 进行运算。

2.2 尾数相加或相减(Adding or Subtracting the Mantissas)

  • 在对阶操作后,两数的指数部分已经对齐,可以直接对它们的尾数进行加法或减法运算。
  • 尾数运算的符号决定于两个浮点数的符号位:
    • 加法:如果两个浮点数符号相同,则进行尾数的相加。
    • 减法:如果两个浮点数符号不同,则进行尾数的相减(这相当于符号不同的加法)。

2.3 规格化结果(Normalizing the Result)

  • 尾数相加或相减后,结果可能需要规格化,即调整尾数和指数,使尾数的范围符合标准(通常在 1 ≤ 尾数 < 2 的范围内)。
  • 规格化可能包括:
    • 左移尾数并减小指数:如果尾数的最高有效位为 0,则需要左移尾数,直到最高有效位为 1,同时指数减 1。
    • 右移尾数并增加指数:如果尾数的位数超过标准的有效位,则需要右移尾数并增加指数。

2.4 舍入操作(Rounding the Result)

  • 在规格化后,可能需要对尾数进行舍入以满足浮点数的精度要求。
  • IEEE 754 标准提供了几种舍入方式,最常用的是就近舍入(Round to nearest, ties to even),即选择最接近的数值,如果刚好在中间,则选择偶数方向。

2.5 溢出和下溢处理(Handling Overflow and Underflow)

  • 规格化和舍入后,需要检查结果是否出现溢出(Overflow)或下溢(Underflow)。
    • 溢出:如果指数超出浮点数表示范围,结果通常设置为正无穷或负无穷。
    • 下溢:如果指数太小,结果可能被设置为零或一个次正规数(即指数为极小值时的数)。

3. 组合最终结果(Combining the Final Result)

  • 最后,将处理后的符号位、指数位和尾数位重新组合成一个符合IEEE 754标准的浮点数,并作为最终结果返回。

总结

浮点数的加减法运算包括多个步骤:对阶、尾数相加或相减、结果规格化、舍入以及溢出/下溢处理。这一系列操作确保了浮点数运算的精度和稳定性。硬件中的浮点运算单元(FPU)专门优化了这些操作,以提高计算效率。

浮点数的乘法和除法运算在计算机中也遵循IEEE 754标准。与浮点数加法和减法相比,乘法和除法的运算过程相对简单一些。以下是浮点数相乘和相除的具体运算细节:

1. 浮点数的表示回顾

  • 符号位(Sign):1 位,用于表示正负号。
  • 指数位(Exponent):表示浮点数的指数部分,经过偏移量调整。
  • 尾数位(Mantissa):表示浮点数的有效数字,通常隐藏了一个隐含的最高位 1(对于规范化数)。

2. 浮点数相乘运算的细节

2.1 符号位的处理

  • 浮点数乘法的符号位由两个浮点数的符号位决定。如果两个浮点数符号相同(都为正或都为负),乘积的符号为正;如果符号不同,乘积的符号为负。
  • 计算方法是简单的异或运算:sign_result = sign_a XOR sign_b

2.2 指数的相加

  • 乘法的指数部分由两个浮点数的指数部分相加,然后减去偏移量(Bias)。这个偏移量是因为浮点数的指数部分在存储时是经过一个偏移量调整的(例如,IEEE 754 单精度浮点数的偏移量为127)。
  • 计算公式:exponent_result = (exponent_a + exponent_b) - Bias

2.3 尾数的相乘

  • 在乘法中,两个浮点数的尾数部分(包括隐含的最高位1)直接相乘。
  • 结果可能包含比标准尾数多出的一些位,需要进行规格化处理。

2.4 规格化结果

  • 乘积的尾数可能需要规格化(如果乘积的最高有效位是2位而不是1位),这通常需要对尾数进行右移一位,同时增加指数。

2.5 舍入和溢出处理

  • 对乘积的尾数进行适当的舍入以符合精度要求。
  • 检查是否发生指数溢出或下溢,并根据需要处理溢出为无穷大,或下溢为零或次正规数。

3. 浮点数相除运算的细节

3.1 符号位的处理

  • 与乘法类似,浮点数除法的符号位由被除数和除数的符号位决定。符号相同则商为正,符号不同则商为负
  • 计算方法仍然是符号位的异或运算:sign_result = sign_a XOR sign_b

3.2 指数的相减

  • 除法的指数部分由被除数的指数减去除数的指数,再加上偏移量(Bias)。
  • 计算公式:exponent_result = (exponent_a - exponent_b) + Bias

3.3 尾数的相除

  • 被除数的尾数除以除数的尾数,计算商的尾数。
  • 与乘法不同的是,除法可能会产生一个需要左移的结果尾数,因此需要处理尾数规格化。

3.4 规格化结果

  • 规格化过程确保结果的尾数在标准范围内。如果除法结果尾数的最高有效位小于1,则需要对尾数进行左移,同时减少指数。

3.5 舍入和溢出处理

  • 尾数进行适当的舍入。
  • 检查是否发生指数溢出或下溢,并根据需要处理。

4. 组合最终结果

  • 最终的符号、指数和尾数经过处理后重新组合成一个符合IEEE 754标准的浮点数,并返回这个结果。

总结

浮点数的乘法和除法运算虽然相对加法和减法来说简单一些,但仍然涉及符号位处理、指数计算、尾数运算、规格化和舍入等多个步骤。计算机通过硬件浮点运算单元(FPU)实现这些运算的高效处理,使得这些复杂的操作在实际应用中能够快速完成。

如何在本地部署deepseek r1模型?

2024年1月20日晚,中国科技公司DeepSeek(深度求索)正式发布了其最新推理模型DeepSeek-R1,引发业界广泛关注。这款模型不仅在性能上与OpenAI的GPT-4相媲美,更以其开源策略和创新的训练方法,为AI发展带来了新的可能性。DeepSeek-R1 在后训练阶段大规模使用了强化学习技术,在仅有极少标注数据的情况下,极大提升了模型推理能力。在数学、代码、自然语言推理等任务上,性能比肩 OpenAI o1 正式版。

本文讲解如何在本地部署deepseek r1模型。deepseek官网https://chat.deepseek.com

1.首先下载ollama

官网:https://ollama.com

下载对应版本即可,下载安装运行

2.下载运行模型

进入ollma官网,点击models,选择deepseek r1,然后选择不同大小的模型,最小的1.5b最大的671b。

下面是不同模型推荐配置

复制下面命令,右键粘贴到cmd或者powershell 回车下载运行

下载运行成功

3.界面搭建

这样就搭建完成了