Swift里的数值变量的最大值和最小值

Swift里有很多种数值变量,如Int,Int8,Float,Double等。和绝大多数编程语言一样,由于是在计算机上运行,内存有限,所以必有最大值和最小值,而计算机无法处理超过该值的数。

在Swift中,数字变量类型都有一些静态属性,其固定值为该类变量的最大值和最小值。

一、整数型变量

(一)如何找到最大值和最小值

Swift里的整数型变量有Int,Int8,Int16,UInt等。这一类的变量,都可通过max,min来找到该类变量的最大值和最小值[1]。

print("Part 1: Integer bounds:\n")
var maxInt = Int.max //2^63-1
var minInt = Int.min //-2^63
print("The max Int is \(maxInt), and the min Int is \(minInt)")
var maxUInt = UInt.max //2^64-1
var minUInt = UInt.min //0
print("The max UInt is \(maxUInt), and the min UInt is \(minUInt)")
var maxInt8 = Int8.max
var minInt8 = Int8.min 
print("The max Int8 is \(maxInt8), and the min Int8 is \(minInt8)")

对于有符号整数类型,Int占64字节,Int32占32字节,以此类推。若该变量占字节数为a,则其最大值为2^{a-1}-1,最小值为-2^{a-1}。对于无符号整数类型,UInt,UInt32等占字节数和有符号类型类似,但最大值为2^a-1,最小值为0。所以上述代码的运行输出为:

(二)超出最大值或最小值的溢出情况

我们知道,在C++中,如果出现了溢出现象,不会报错,而是会跳转至另一端。例如,对于int类型变量,最大值是2147483647,最大值+1就会计算出最小值-2147483648[2]。

#include <iostream> 
#include <string>
#include <climits>
using namespace std;
void main(){int num = INT_MAX;int too_big_num = num + 1;cout << "num=" << num << '\n';cout << "too_big_num=" << too_big_num;
}

上述代码运行输出为

那么在Swift中呢?

import Foundationvar num = Int.max
var too_big_num = num + 1
print("num=\(num)")
print("too_big_num=\(too_big_num)")

该程序运行会报错

这个错误是溢出错误。Swift不像C++,在处理整型变量时并不会在溢出时跳转到另一端。

那么,能不能用try ... catch的语句捕捉这个错误呢?

import Foundationvar num = Int.max
var too_big_num:Int?
do{too_big_num = try?(num + 1)
}
catch{print("Overflow")
}
print("num=\(num)")
print("too_big_num=\(too_big_num)")

该代码仍然无法运行,会报错。

原因在于,这样的溢出错误在Swift中属于FatalError。Swift的try ... catch机制无法处理FatalError[3]。有关Swift的错误捕获机制,请阅读[3]。

二、小数型变量

在Swift中,对于小数型变量,也就是Float和Double类型,不能像整型变量那样用max和min来得到最大值和最小值。但对于这一类变量,Swift里也定义了一些静态属性,表明它们的极限值[4]。

(一)小数型变量的极限值

小数型变量和整数型变量的区别在于小数型变量,即实数,从纯数学角度来看是连续的,也就是两个不同的实数中间总存在第三个实数[5],即不存在相邻的两个实数。因此,数学上不存在最接近0的非零实数,但作为计算机编程语言,Swift不可能处理"无限接近"的概念。因此小数型变量的极限值有以下三种[4]。

(1)greatestFiniteMagnitude:Swift能处理的最大的绝对值,超过该值即为溢出。

(2)leastNormalMagnitude:Swift能处理的最小的正常态数,若小于该数,则Swift处理时无法保证精度。

(3)leastNonzeroMagnitude:Swift能处理的最小正数,也就是Swift能处理的不为零的绝对值最小值。

关于常态数(normal value)和非常态数(subnormal value)的区别,详见[6]。更具体的解释在[7]。简单地说,因为小数在计算机里表达的形式是x*2^y,其中x是一个用指定个数的bit表示的2进制小数(Float类型24位,Double类型53位),且规定只有第一位在小数点前;y是一个二进制表示的整数,Float类是-126~+128之间(8位),Double类是-1022~+1024之间(11位))。[7]中说Double类的指数最小-2046似乎不对,但也可能是Swift和别的语言不完全一样。而最小的正常态数是指x首位为1的数中最小的数(此时y已取最小值-126,而更小的数称为非常态数,所以计算精度会减小,因为x首位不为1所以尾数(mantissa)的有效位数(significant bit)减少了[6]。

(二)比最大值更大或比最小值更小的溢出情况

在Swift中,对于小数型变量,即使溢出,也不会报错,而是会给出一个预留的特殊值。

如果绝对值超过最大值,则计为"无穷大"。如果绝对值小于最小值,则计为0。

print("\nPart 2: Floats and Doubles\n")
//But to get the greatest finite Float/Double, use this
var maxFloat = Float.greatestFiniteMagnitude
print("The max finite Float is \(maxFloat)")
var tooBigFloat = maxFloat * 1.1 //too big then infinity
print("If the Float is too big, then it becomes \(tooBigFloat)")
var tooBigFloat2 = Float.infinity //you can create infinity by a Swift function
print("Infinity can be created with Float.infinity. tooBigFloat2 = \(tooBigFloat2)")
var undef = tooBigFloat * 0 // 0*inf is undefined
print("0*inf is \(undef)")
var undef2 = Float.nan //you can create nan by a Swift function
// in addition, you can also find the smallest magnitude, which means that anything with absolute number smaller than this will be regarded as 0
var minFloat = Float.leastNonzeroMagnitude
print("The min non-zero Float is \(minFloat)")
var tooSmallFloat = minFloat / 2
print("If the Float is too small, then it becomes \(tooSmallFloat)")

运行输出为:

注意:Swift中对于Float和Double,存在inf(无穷大)和nan(未定义)。

(三)小于最小的常态数但不为0

正如前面说到的,非常态数的精度不如常态数。

下面的例子里,定义一个最小常态数minNormalDouble,再定义一个最小的非0数minDouble(小于minNormalDouble),然后把它们分别乘以1.01,观察结果是否能被判断出比原来大。

var maxDouble = Double.greatestFiniteMagnitude
print("The max finite Double is \(maxDouble)")
var minDouble = Double.leastNonzeroMagnitude
print("The least non-zero Double is \(minDouble)")
var minNormalDouble = Double.leastNormalMagnitude
print("The least normal Double is \(minNormalDouble)")//How normal magnitude is different from non-zero magnitude?
print("\nPart 2.5: difference between normal and non-zero\n")
print("minDouble * 1.01 > minDouble? \(minDouble * 1.01 > minDouble)")print("minNormalDouble * 1.01 > minNormalDouble? \(minNormalDouble * 1.01 > minNormalDouble)")

运行输出为:

从结果中可看出,最小常态数minNormalDouble在乘以1.01后,大于原值,但最小非零数minDouble在乘以1.01后,并不大于原值。这是因为最小非零数minDouble的精度不足以计算它的0.01倍的差别,不如最小常态数minNormalDouble的精度。

三、总结

对于Swift里的数值类型的变量,可以通过其类的自带静态属性找出最小值和最大值。其中,对于整数型变量,一旦越过最值,就会报错;但对于小数型变量,即使越过最值也不会报错,而是会用特殊的方法计算。另外,常态数和非常态数的区别在于精度。

四、参考资料

[1]Swift学习笔记(九)——整型Int在Swift中表示的最大值最小值问题_swift int 最大值-CSDN博客

[2]【C++】详解 INT_MAX 和 INT_MIN(INT_MAX 和 INT_MIN是什么?它们的用途是什么?如何防止溢出?)_c++ int max-CSDN博客

[3]Swift --- 错误处理(Error):throws、断言assert、fatalError_fatalerror swift-CSDN博客

[4]Swift中Double的常见一些API - 简书

[5]如何理解实数的连续性?

[6]Normal vs Subnormal Floats | Programming.Guide

[7]15张图带你深入理解浮点数

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

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

相关文章

Unity 3D 概览一口气讲完!\(@^0^@)/

PS:好久没做Unity内容了&#xff0c;先做个合集凑合看着吧。。谢啦!!☆⌒(*&#xff3e;-゜)v Unity 3D 简介 Unity 3D 也称 Unity&#xff0c;是由 Unity Technologies 公司开发的一个让玩家轻松创建诸如三维视频游戏、建筑可视化、实时三维动画等类型互动内容的多平台的综…

AI大模型站在十字路口,持续突破or陷入低谷?

文&#xff5c;白 鸽 编&#xff5c;王一粟 当普通人被AI轰炸的已经疲劳&#xff0c;应用落地也没有惊人地突破&#xff0c;AI大模型的发展似乎已经进入瓶颈期。 在云栖大会之前&#xff0c;业界弥漫着对AI的唱衰&#xff0c;似乎又到了一个历史的转折点。如2017年上一代深度…

MySQL的索引——提高查找算法的数据结构 B+树

我们MYSQL服务器是在内存中的&#xff0c;所以所有的操作也是内存级的&#xff0c;索引也是如此 我们要提高算法的效率&#xff1a;首先要用一个好的数据存储结构储存数据&#xff0c;然后结构决定算法 所以——索引的本质就是一种提高算法效率组织的数据结构 缩印的主要价值体…

如何使用 React、TypeScript、TailwindCSS 和 Vite 创建 Chrome 插件

创建一个 Chrome 插件是一个有趣的项目&#xff0c;特别是当结合使用强大的工具如 React、TypeScript、TailwindCSS 和 Vite 时 在这篇文章中&#xff0c;我们将逐步引导完成整个过程&#xff0c;了解如何在 2024 年构建自己的 Chrome 插件。无论是经验丰富的开发者还是刚刚起…

Kafka 为什么这么快?

Kafka 是一款性能非常优秀的消息队列&#xff0c;每秒处理的消息体量可以达到千万级别。今天来聊一聊 Kafka 高性能背后的技术原理。 1 批量发送 Kafka 收发消息都是批量进行处理的。我们看一下 Kafka 生产者发送消息的代码&#xff1a; private Future<RecordMetadata>…

Mysql进阶——1

一.MySQL程序简介 本章介绍 MySQL 命令⾏程序以及在运⾏这些程序时指定选项的⼀般语法。 对常⽤程序进⾏详细的讲解&#xff0c;包括它们的选项。 MySQL安装完成通常会包含如下程序&#xff1a; • Linux系统程序⼀般在 /usr/bin⽬录下&#xff0c;可以通过命令查看&#x…

MySQL篇(索引)(持续更新迭代)

目录 一、简介 二、有无索引情况 1. 无索引情况 2. 有索引情况 3. 优劣势 三、索引结构 1. 简介 2. 存储引擎对于索引结构的支持情况 3. 为什么InnoDB默认的索引结构是Btree而不是其它树 3.1. 二叉树&#xff08;BinaryTree&#xff09; 3.2. 红黑树&#xff08;RB&a…

让模型评估模型:构建双代理RAG评估系统的步骤解析

在当前大语言模型(LLM)应用开发的背景下,一个关键问题是如何评估模型输出的准确性。我们需要确定哪些评估指标能够有效衡量提示(prompt)的效果,以及在多大程度上需要对提示进行优化。 为解决这一问题,我们将介绍一个基于双代理的RAG(检索增强生成)评估系统。该系统使用生成代理…

MySQL练手题--日期连续类型(困难)

一、准备工作 Create table If Not Exists Failed (fail_date date); Create table If Not Exists Succeeded (success_date date); Truncate table Failed; insert into Failed (fail_date) values (2018-12-28); insert into Failed (fail_date) values (2018-12-29); inser…

攻防世界-1-misc

下载附件&#xff0c;提示需要密码 提示密码是出题人的生日&#xff0c;这里可以自己定义一个关于生日的字典&#xff0c;使用字典生成工具&#xff0c;直接生成字典。&#xff08;我用的是19000101至20231231字典进行的爆破测试&#xff09; 使用archpr软件&#xff0c;和刚刚…

k8s下的网络通信与调度

目录 一、k8s网络通信 1、k8s通信整体架构 2、flannel网络插件 &#xff08;1&#xff09;flannel跨主机通信原理 &#xff08;2&#xff09;flannel支持的后端模式 3、calico网络插件 &#xff08;1&#xff09;简介 &#xff08;2&#xff09;网络架构 &#xff08;…

Css_动态渐变圆圈旋转效果

1、效果图 2、实现代码 <template><div class"box"><div class"line"></div><div class"lineNew"></div></div> </template><script lang"ts" setup></script><styl…

C语言 | Leetcode C语言题解之第421题数组中两个数的最大异或值

题目&#xff1a; 题解&#xff1a; const int HIGH_BIT 30;struct Trie {// 左子树指向表示 0 的子节点struct Trie* left;// 右子树指向表示 1 的子节点struct Trie* right; };struct Trie* createTrie() {struct Trie* ret malloc(sizeof(struct Trie));ret->left re…

天润融通创新功能,将无效会话转化为企业新商机

“您好&#xff0c;请问有什么可以帮您&#xff1f;” “......” 一个新的咨询会话进来&#xff0c;但客户却并不说话&#xff0c;这种情况客服人员肯定不会陌生&#xff0c;它一般被称为“无效会话”。 如今“无效会话”越来越多&#xff0c;已经成为困扰无数企业的难题。…

数学建模 第二讲 - 初等建模

绪论 主要内容:介绍以下几个初等模型&#xff0c;椅子问题、席位分配问题、行走步长问题、实物交换模型。 主要目的:体会数学建模的形式多样性与方法多样性&#xff0c;了解建模思想&#xff0c;着重理解由现实问题向数学问题的转化过程。 一、椅子问题 问题 四条腿长度相等…

Flat File端口更新:如何实现嵌套结构

Flat File端口可以实现平面文件和XML文件的互相转换&#xff0c;本文主要介绍在知行之桥EDI系统8971及更高版本中&#xff0c;Flat File端口如何支持类似EDI嵌套结构的转换。 Flatfile端口如何自定义嵌套结构 下载示例工作流以及示例文件 打开知行之桥EDI系统&#xff0c;创建…

2024年中国研究生数学建模竞赛ABCDEF题【附带解题思路代码+结果】

2024年中国研究生数学建模竞赛D题 点击链接加入群聊【2024华为杯数学建模助攻资料】&#xff1a;http://qm.qq.com/cgi-bin/qm/qr?_wv1027&kxtS4vwn3gcv8oCYYyrqd0BvFc7tNfhV7&authKeyedQFZne%2BzvEfLEVg2v8FOm%2BWNg1V%2Fiv3H4tcE6X%2FW6lCmkhaSaZV4PwQ%2FOVPDtF%2B…

css实现居中的方法

水平居中 1. 行内设置text-align 给父元素设置text-align为center&#xff0c;一般用于实现文字水平居中 2. 给当前元素设置margin&#xff1a;0 auto 原理&#xff1a;块级独占一行&#xff0c;表现为在水平方向上占满整个父容器&#xff0c;当水平方向padding&#xff0c;…

算法-Init

&#xff08;1&#xff09;有限性&#xff08;Finiteness&#xff09;&#xff1a;算法必 需在有限步骤内结束&#xff1b; &#xff08;2&#xff09;确定性&#xff08;Definiteness&#xff09;&#xff1a;算法的每一个步骤必须清晰无歧义地定义&#xff1b; &#xff08;3…

2024年Q3国际信息系统安全认证联盟(ISC2)内部研讨会要点分享

2024年是CISSP认证成立30周年&#xff0c;这是一项具有里程碑意义的成就&#xff0c;代表了CISSP在网络安全领域的卓越、创新和领导力。博主于今年9月份参加了ISC2&#xff08;国际信息系统安全认证联盟&#xff09;组织的2024年第3季度内部网络研讨会&#xff0c;针对会议中的…