C++标准模板(STL)- 类型支持 (数值极限,round_style,is_iec559,is_bounded)

news2024/11/17 7:29:33

数值极限


定义于头文件 <limits>

定义于头文件 <limits>

template< class T > class numeric_limits;

numeric_limits 类模板提供查询各种算术类型属性的标准化方式(例如 int 类型的最大可能值是 std::numeric_limits<int>::max() )。
 

鉴别类型所用的舍入模式

std::numeric_limits<T>::round_style

static const std::float_round_style round_style;

(C++11 前)

static constexpr std::float_round_style round_style;

(C++11 起)

标准特化

Tstd::numeric_limits<T>::round_style 的值
/* non-specialized */std::round_toward_zero
boolstd::round_toward_zero
charstd::round_toward_zero
signed charstd::round_toward_zero
unsigned charstd::round_toward_zero
wchar_tstd::round_toward_zero
char8_tstd::round_toward_zero
char16_tstd::round_toward_zero
char32_tstd::round_toward_zero
shortstd::round_toward_zero
unsigned shortstd::round_toward_zero
intstd::round_toward_zero
unsigned intstd::round_toward_zero
longstd::round_toward_zero
unsigned longstd::round_toward_zero
long longstd::round_toward_zero
unsigned long longstd::round_toward_zero
float通常为 std::round_to_nearest
double通常为 std::round_to_nearest
long double通常为 std::round_to_nearest

注意

这些值是常量,且不反映 std::fesetround 所做的舍入模式更改。被更改的值可从 FLT_ROUNDS 或 std::fegetround 获得。

示例

十进制值 0.1 不能表示成二进制浮点类型。在存储于 IEEE-745 double 时,它落入 0x1.9999999999999*2-4与 0x1.999999999999a*2-4之间。舍入到最近可表示结果导致 0x1.999999999999a*2-4。同样地,十进制值 0.3 在 0x1.3333333333333*2-2与 0x1.3333333333334*2-2
之间,舍入到最近值后存储为 0x1.3333333333333*2-2。

 调用示例

#include <iostream>
#include <string>
#include <limits>

struct SName
{
};

//偏特化
struct SPartSpec
{
};

namespace std
{
template<>
struct numeric_limits<SPartSpec>
{
    static _GLIBCXX_USE_CONSTEXPR bool is_specialized   = true;
    static _GLIBCXX_USE_CONSTEXPR bool is_signed        = true;
    static _GLIBCXX_USE_CONSTEXPR bool is_integer       = true;
    static _GLIBCXX_USE_CONSTEXPR bool is_exact         = true;
    static _GLIBCXX_USE_CONSTEXPR bool has_infinity     = true;
    static _GLIBCXX_USE_CONSTEXPR bool has_quiet_NaN    = true;
    static _GLIBCXX_USE_CONSTEXPR bool has_signaling_NaN = true;
    static _GLIBCXX_USE_CONSTEXPR float_denorm_style has_denorm     = denorm_present;
    static _GLIBCXX_USE_CONSTEXPR bool has_denorm_loss  = true;
    static _GLIBCXX_USE_CONSTEXPR float_round_style round_style     = round_toward_neg_infinity;
};
}

int main()
{
    std::cout << std::boolalpha;
    std::cout << "std::numeric_limits<bool>::round_style:                 "
              << std::numeric_limits<bool>::round_style << std::endl;
    std::cout << "std::numeric_limits<char>::round_style:                 "
              << std::numeric_limits<char>::round_style << std::endl;
    std::cout << "std::numeric_limits<signed char>::round_style:          "
              << std::numeric_limits<signed char>::round_style << std::endl;
    std::cout << "std::numeric_limits<unsigned char>::round_style:        "
              << std::numeric_limits<unsigned char>::round_style << std::endl;
    std::cout << "std::numeric_limits<wchar_t>::round_style:              "
              << std::numeric_limits<wchar_t>::round_style << std::endl;
    std::cout << "std::numeric_limits<char16_t>::round_style:             "
              << std::numeric_limits<char16_t>::round_style << std::endl;
    std::cout << "std::numeric_limits<char32_t>::round_style:             "
              << std::numeric_limits<char32_t>::round_style << std::endl;
    std::cout << "std::numeric_limits<short>::round_style:                "
              << std::numeric_limits<short>::round_style << std::endl;
    std::cout << "std::numeric_limits<unsigned short>::round_style:       "
              << std::numeric_limits<unsigned short>::round_style << std::endl;
    std::cout << "std::numeric_limits<int>::round_style:                  "
              << std::numeric_limits<int>::round_style << std::endl;
    std::cout << "std::numeric_limits<unsigned int>::round_style:         "
              << std::numeric_limits<unsigned int>::round_style << std::endl;
    std::cout << "std::numeric_limits<long>::round_style:                 "
              << std::numeric_limits<long>::round_style << std::endl;
    std::cout << "std::numeric_limits<unsigned long>::round_style:        "
              << std::numeric_limits<unsigned long>::round_style << std::endl;
    std::cout << "std::numeric_limits<long long>::round_style:            "
              << std::numeric_limits<long long>::round_style << std::endl;
    std::cout << "std::numeric_limits<unsigned long long>::round_style:   "
              << std::numeric_limits<unsigned long long>::round_style << std::endl;
    std::cout << "std::numeric_limits<float>::round_style:                "
              << std::numeric_limits<float>::round_style << std::endl;
    std::cout << "std::numeric_limits<double>::round_style:               "
              << std::numeric_limits<double>::round_style << std::endl;
    std::cout << "std::numeric_limits<long double>::round_style:          "
              << std::numeric_limits<long double>::round_style << std::endl;
    std::cout << "std::numeric_limits<std::string>::round_style:          "
              << std::numeric_limits<std::string>::round_style << std::endl;
    std::cout << "std::numeric_limits<SName>::round_style:                "
              << std::numeric_limits<SName>::round_style << std::endl;
    std::cout << "std::numeric_limits<SPartSpec>::round_style:            "
              << std::numeric_limits<SPartSpec>::round_style << std::endl;
    return 0;
}

输出

鉴别 IEC 559/IEEE 754 浮点类型

std::numeric_limits<T>::is_iec559

static const bool is_iec559;

(C++11 前)

static constexpr bool is_iec559;

(C++11 起)

 std::numeric_limits<T>::is_iec559 的值对于所有符合 IEC 559 ( IEEE 754 )标准要求的浮点类型 T 为 true 。若 std::numeric_limits<T>::is_iec559 为 true ,则 std::numeric_limits<T>::has_infinity 、 std::numeric_limits<T>::has_quiet_NaN 与 std::numeric_limits<T>::has_signaling_NaN 亦为 true 。

标准特化

Tstd::numeric_limits<T>::is_iec559 的值
/* non-specialized */false
boolfalse
charfalse
signed charfalse
unsigned charfalse
wchar_tfalse
char8_tfalse
char16_tfalse
char32_tfalse
shortfalse
unsigned shortfalse
intfalse
unsigned intfalse
longfalse
unsigned longfalse
long longfalse
unsigned long longfalse
float通常为 true
double通常为 true
long double通常为 true

调用示例

#include <iostream>
#include <string>
#include <limits>

struct SName
{
};

//偏特化
struct SPartSpec
{
};

namespace std
{
template<>
struct numeric_limits<SPartSpec>
{
    static _GLIBCXX_USE_CONSTEXPR bool is_specialized   = true;
    static _GLIBCXX_USE_CONSTEXPR bool is_signed        = true;
    static _GLIBCXX_USE_CONSTEXPR bool is_integer       = true;
    static _GLIBCXX_USE_CONSTEXPR bool is_exact         = true;
    static _GLIBCXX_USE_CONSTEXPR bool has_infinity     = true;
    static _GLIBCXX_USE_CONSTEXPR bool has_quiet_NaN    = true;
    static _GLIBCXX_USE_CONSTEXPR bool has_signaling_NaN = true;
    static _GLIBCXX_USE_CONSTEXPR float_denorm_style has_denorm     = denorm_present;
    static _GLIBCXX_USE_CONSTEXPR bool has_denorm_loss  = true;
    static _GLIBCXX_USE_CONSTEXPR float_round_style round_style     = round_toward_neg_infinity;
    static _GLIBCXX_USE_CONSTEXPR bool is_iec559        = true;
};
}

int main()
{
    std::cout << std::boolalpha;
    std::cout << "std::numeric_limits<bool>::is_iec559:                 "
              << std::numeric_limits<bool>::is_iec559 << std::endl;
    std::cout << "std::numeric_limits<char>::is_iec559:                 "
              << std::numeric_limits<char>::is_iec559 << std::endl;
    std::cout << "std::numeric_limits<signed char>::is_iec559:          "
              << std::numeric_limits<signed char>::is_iec559 << std::endl;
    std::cout << "std::numeric_limits<unsigned char>::is_iec559:        "
              << std::numeric_limits<unsigned char>::is_iec559 << std::endl;
    std::cout << "std::numeric_limits<wchar_t>::is_iec559:              "
              << std::numeric_limits<wchar_t>::is_iec559 << std::endl;
    std::cout << "std::numeric_limits<char16_t>::is_iec559:             "
              << std::numeric_limits<char16_t>::is_iec559 << std::endl;
    std::cout << "std::numeric_limits<char32_t>::is_iec559:             "
              << std::numeric_limits<char32_t>::is_iec559 << std::endl;
    std::cout << "std::numeric_limits<short>::is_iec559:                "
              << std::numeric_limits<short>::is_iec559 << std::endl;
    std::cout << "std::numeric_limits<unsigned short>::is_iec559:       "
              << std::numeric_limits<unsigned short>::is_iec559 << std::endl;
    std::cout << "std::numeric_limits<int>::is_iec559:                  "
              << std::numeric_limits<int>::is_iec559 << std::endl;
    std::cout << "std::numeric_limits<unsigned int>::is_iec559:         "
              << std::numeric_limits<unsigned int>::is_iec559 << std::endl;
    std::cout << "std::numeric_limits<long>::is_iec559:                 "
              << std::numeric_limits<long>::is_iec559 << std::endl;
    std::cout << "std::numeric_limits<unsigned long>::is_iec559:        "
              << std::numeric_limits<unsigned long>::is_iec559 << std::endl;
    std::cout << "std::numeric_limits<long long>::is_iec559:            "
              << std::numeric_limits<long long>::is_iec559 << std::endl;
    std::cout << "std::numeric_limits<unsigned long long>::is_iec559:   "
              << std::numeric_limits<unsigned long long>::is_iec559 << std::endl;
    std::cout << "std::numeric_limits<float>::is_iec559:                "
              << std::numeric_limits<float>::is_iec559 << std::endl;
    std::cout << "std::numeric_limits<double>::is_iec559:               "
              << std::numeric_limits<double>::is_iec559 << std::endl;
    std::cout << "std::numeric_limits<long double>::is_iec559:          "
              << std::numeric_limits<long double>::is_iec559 << std::endl;
    std::cout << "std::numeric_limits<std::string>::is_iec559:          "
              << std::numeric_limits<std::string>::is_iec559 << std::endl;
    std::cout << "std::numeric_limits<SName>::is_iec559:                "
              << std::numeric_limits<SName>::is_iec559 << std::endl;
    std::cout << "std::numeric_limits<SPartSpec>::is_iec559:            "
              << std::numeric_limits<SPartSpec>::is_iec559 << std::endl;
    return 0;
}

 输出

鉴别表示有限值集合的类型

std::numeric_limits<T>::is_bounded

static const bool is_bounded;

(C++11 前)

static constexpr bool is_bounded;

(C++11 起)

 std::numeric_limits<T>::is_bounded 对所有表示有限的值集合的算术类型 T 为 true 。所有基础类型均有界,不过此常量会在 std::numeric_limits 对库提供的任意精度算术类型的特化中为 false 。

标准特化

Tstd::numeric_limits<T>::is_bounded 的值
/* non-specialized */false
booltrue
chartrue
signed chartrue
unsigned chartrue
wchar_ttrue
char8_ttrue
char16_ttrue
char32_ttrue
shorttrue
unsigned shorttrue
inttrue
unsigned inttrue
longtrue
unsigned longtrue
long longtrue
unsigned long longtrue
floattrue
doubletrue
long doubletrue

调用示例

#include <iostream>
#include <string>
#include <limits>

struct SName
{
};

//偏特化
struct SPartSpec
{
};

namespace std
{
template<>
struct numeric_limits<SPartSpec>
{
    static _GLIBCXX_USE_CONSTEXPR bool is_specialized   = true;
    static _GLIBCXX_USE_CONSTEXPR bool is_signed        = true;
    static _GLIBCXX_USE_CONSTEXPR bool is_integer       = true;
    static _GLIBCXX_USE_CONSTEXPR bool is_exact         = true;
    static _GLIBCXX_USE_CONSTEXPR bool has_infinity     = true;
    static _GLIBCXX_USE_CONSTEXPR bool has_quiet_NaN    = true;
    static _GLIBCXX_USE_CONSTEXPR bool has_signaling_NaN = true;
    static _GLIBCXX_USE_CONSTEXPR float_denorm_style has_denorm     = denorm_present;
    static _GLIBCXX_USE_CONSTEXPR bool has_denorm_loss  = true;
    static _GLIBCXX_USE_CONSTEXPR float_round_style round_style     = round_toward_neg_infinity;
    static _GLIBCXX_USE_CONSTEXPR bool is_iec559        = true;
    static _GLIBCXX_USE_CONSTEXPR bool is_bounded       = true;
};
}

int main()
{
    std::cout << std::boolalpha;
    std::cout << "std::numeric_limits<bool>::is_bounded:                 "
              << std::numeric_limits<bool>::is_bounded << std::endl;
    std::cout << "std::numeric_limits<char>::is_bounded:                 "
              << std::numeric_limits<char>::is_bounded << std::endl;
    std::cout << "std::numeric_limits<signed char>::is_bounded:          "
              << std::numeric_limits<signed char>::is_bounded << std::endl;
    std::cout << "std::numeric_limits<unsigned char>::is_bounded:        "
              << std::numeric_limits<unsigned char>::is_bounded << std::endl;
    std::cout << "std::numeric_limits<wchar_t>::is_bounded:              "
              << std::numeric_limits<wchar_t>::is_bounded << std::endl;
    std::cout << "std::numeric_limits<char16_t>::is_bounded:             "
              << std::numeric_limits<char16_t>::is_bounded << std::endl;
    std::cout << "std::numeric_limits<char32_t>::is_bounded:             "
              << std::numeric_limits<char32_t>::is_bounded << std::endl;
    std::cout << "std::numeric_limits<short>::is_bounded:                "
              << std::numeric_limits<short>::is_bounded << std::endl;
    std::cout << "std::numeric_limits<unsigned short>::is_bounded:       "
              << std::numeric_limits<unsigned short>::is_bounded << std::endl;
    std::cout << "std::numeric_limits<int>::is_bounded:                  "
              << std::numeric_limits<int>::is_bounded << std::endl;
    std::cout << "std::numeric_limits<unsigned int>::is_bounded:         "
              << std::numeric_limits<unsigned int>::is_bounded << std::endl;
    std::cout << "std::numeric_limits<long>::is_bounded:                 "
              << std::numeric_limits<long>::is_bounded << std::endl;
    std::cout << "std::numeric_limits<unsigned long>::is_bounded:        "
              << std::numeric_limits<unsigned long>::is_bounded << std::endl;
    std::cout << "std::numeric_limits<long long>::is_bounded:            "
              << std::numeric_limits<long long>::is_bounded << std::endl;
    std::cout << "std::numeric_limits<unsigned long long>::is_bounded:   "
              << std::numeric_limits<unsigned long long>::is_bounded << std::endl;
    std::cout << "std::numeric_limits<float>::is_bounded:                "
              << std::numeric_limits<float>::is_bounded << std::endl;
    std::cout << "std::numeric_limits<double>::is_bounded:               "
              << std::numeric_limits<double>::is_bounded << std::endl;
    std::cout << "std::numeric_limits<long double>::is_bounded:          "
              << std::numeric_limits<long double>::is_bounded << std::endl;
    std::cout << "std::numeric_limits<std::string>::is_bounded:          "
              << std::numeric_limits<std::string>::is_bounded << std::endl;
    std::cout << "std::numeric_limits<SName>::is_bounded:                "
              << std::numeric_limits<SName>::is_bounded << std::endl;
    std::cout << "std::numeric_limits<SPartSpec>::is_bounded:            "
              << std::numeric_limits<SPartSpec>::is_bounded << std::endl;
    return 0;
}

 输出

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

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

相关文章

聚观早报 | 首个“5G-A智慧家庭”发布;李鹏称5G-A是5G发展选择

【聚观365】10月12日消息 首个“5G-A智慧家庭”发布 李鹏称5G-A是5G发展的自然选择 新版努比亚Z50S Pro开售 英特尔锐炫A580显卡全球同步上市 vivo X100系列年底登场 首个“5G-A智慧家庭”发布 在全球移动宽带论坛&#xff08;MBBF2023&#xff09;期间&#xff0c;du联合…

中国长序列地表冻融数据集(1978-2015)

简介&#xff1a; 中国长序列地表冻融数据集——双指标算法(1978-2015)采用SMMR&#xff08;1978-1987&#xff09;、SSM/I&#xff08;1987-2009&#xff09;和SSMIS&#xff08;2009-2015&#xff09;逐日亮温数据&#xff0c;由双指标&#xff08;TB,37v&#xff0c;SG&…

【C++进阶之路】C++11(中)

一、可变参数模板 1.基本概念 想要了解C语言的可变参数列表的原理可见&#xff1a;可变参数列表 这个跟C语言的可变参数列表有一定的关系,常用的printf与scanf的参数就包含可变参数列表。 那么可变参数模板是什么呢&#xff1f;举个例子便一目了然。 template<class...Arg…

Qt Quick读取本地文件并显示成表格

&#x1f680;作者&#xff1a;CAccept &#x1f382;专栏&#xff1a;Qt Quick 文章目录 &#x1f34e;C代码部分实现&#x1f680;C类注册到QML中&#x1f382;QML部分实现&#x1f330;小知识点⭐C与QML进行交互⭐将运行路径进行传递保证程序的稳定性⭐QML中定义信号其默认…

【Proteus仿真】【STM32单片机】智能加湿器设计

文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用Proteus8仿真STM32单片机控制器&#xff0c;使用LCD1602液晶、按键、蜂鸣器、DHT11温湿度传感器、水位传感器、PCF8591 ADC、继电器、加湿装置等。 主要功能&#xff1a; 系统运行后&#xff0…

从零开始:深入理解Kubernetes架构及安装过程

K8s环境搭建 文章目录 K8s环境搭建集群类型安装方式环境规划克隆三台虚拟机系统环境配置集群搭建初始化集群&#xff08;仅在master节点&#xff09;配置环境变量&#xff08;仅在master节点&#xff09;工作节点加入集群&#xff08;knode1节点及knode2节点&#xff09;安装ca…

吃鸡高手秘籍大揭秘,享受顶级游戏干货!

大家好&#xff01;作为吃鸡行家&#xff0c;今天我将揭示一些与众不同、足够吸引力的内容&#xff0c;帮助您提高游戏战斗力并分享顶级游戏作战干货。 首先&#xff0c;让我们推荐一些绝地求生作图工具。这些工具可以帮助您在游戏中更好地制作作战图和规划策略&#xff0c;让您…

基于RuoYi-Flowable-Plus的若依ruoyi-nbcio支持本地图片上传与回显的功能实现(二)

更多ruoyi-nbcio功能请看演示系统 gitee源代码地址 前后端代码&#xff1a; https://gitee.com/nbacheng/ruoyi-nbcio 演示地址&#xff1a;RuoYi-Nbcio后台管理系统 排除路径&#xff0c;增加avatar图片 # security配置 security:# 排除路径excludes:# 静态资源- /*.html…

Python+Tkinter 图形化界面基础篇:集成数据库

PythonTkinter 图形化界面基础篇&#xff1a;集成数据库 引言为什么选择 SQLite 数据库&#xff1f;集成 SQLite 数据库的步骤示例&#xff1a;创建一个任务管理应用程序步骤1&#xff1a;导入必要的模块步骤2&#xff1a;创建主窗口和数据库连接步骤3&#xff1a;创建数据库表…

Spring源码解析—— AOP代理的生成

本文已经收录到大彬精心整理的大厂面试手册&#xff0c;包含计算机基础、Java基础、多线程、JVM、数据库、Redis、Spring、Mybatis、SpringMVC、SpringBoot、分布式、微服务、设计模式、架构、校招社招分享等高频面试题&#xff0c;非常实用&#xff0c;有小伙伴靠着这份手册拿…

(1)(1.3) 匿名航空电子设备DroneCAN激光雷达接口

文章目录 前言 1 设置参数 2 参数说明 前言 Avionics Anonymous DroneCAN 激光雷达接口是一个微型接口(Avionics Anonymous DroneCAN LIDAR Interface)&#xff0c;适用于几种常见的激光测距仪(several common laser rangefinders)&#xff0c;可通过 DroneCAN 连接到 Pixha…

混淆技术研究笔记(五)混淆后如何反篡改?

有了上一节的基础工具后&#xff0c;接下来要考虑如何反篡改。 本文采用的是对混淆后的代码&#xff0c;针对某些关键包的字节码数据计算md5值&#xff0c;对所有类计算完成后对md5值进行排序&#xff0c;排序后拼接字符串再次计算md5值&#xff0c;最后通过私钥对md5进行RSA对…

Linux之open和fopen的比较

1、fopen 是ANSIC标准中的C库函数&#xff0c;open是系统调用 2、fopen提供了IO缓存功能&#xff0c;而open没有&#xff0c;所以fopen速度要比open快 3、fopen具有良好的移植性&#xff0c;而open 是依赖于特定的环境 4、fopen返回一个FILE 结构体指针&#xff0c;而open 返…

MES管理系统如何解决电子企业的生产痛点

随着电子行业的快速发展&#xff0c;企业面临着越来越多的生产和管理挑战。其中&#xff0c;物料编码管理困难、产品设计工作繁重、客户需求多样化 以及产品设计变更管理困难等问题尤为突出。为了解决这些问题&#xff0c;许多电子企业开始引入MES管理系统解决方案&#xff0c;…

如何实现响应式网页设计?

聚沙成塔每天进步一点点 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 欢迎来到前端入门之旅&#xff01;感兴趣的可以订阅本专栏哦&#xff01;这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发…

做直播或短视频 其实有几个精准粉丝就可以很快变现

随着短视频 和 直播 快速发展 人流量巨大 只要是个东西 只要你能豁得出去 都能卖出去 把精准流量引流到自己的私域里面 可以组建团队 一起发展 自己喝点汤就好 有一起做CSDN和其他短视频项目的 可以左上方私信留言 我怕说多了 审核不过去

Svelte生命周期(加整体概述)

目录 前言 一、编译阶段 1. 导入语句 2. 组件声明 3. 模板部分 4. CSS样式 二、运行时阶段 三、生命周期函数 1. onMount 2. beforeUpdate 与 afterUpdate 3. onDestroy 4. setContext 与 getContext 6. hasContext 7. getAllContexts 前言 Svelte是一种现代的Ja…

冠军代言|媒介易:释放品牌潜力,实力助力,助您势如破竹!

在竞争激烈的市场中&#xff0c;品牌需要不断创新&#xff0c;找到吸引目标客户的方法。而与体育冠军合作&#xff0c;通过冠军代言&#xff0c;已经成为了众多企业提高品牌知名度、树立形象、吸引消费者目光的重要策略之一。在这个领域&#xff0c;媒介易以其实力加冕&#xf…

如何正确高效使用墨西哥专线?

在当今全球化的物流行业中&#xff0c;跨境运输服务已经成为许多企业拓展国际市场的重要手段。然而&#xff0c;由于各国法律法规、文化差异以及运输环节的复杂性&#xff0c;企业在进行跨境运输时可能会遇到诸多挑战。为了解决这些问题&#xff0c;一些专业的物流公司推出了“…

浅谈电能质量监测装置在某半导体公司的应用

摘 要&#xff1a;半导体生产制造业在国民经济中起着举足轻重的作用&#xff0c;相关企业的规模也越来越大。其供配电系统稳定、可靠的运维不仅是其安全生产的基本保证&#xff0c;还关系到产品质量和生产的顺利进行。而半导体行业中大部分工艺设备对电能质量比较敏感&#xff…