rust实战系列十二:浮点类型

Rust提供了基于IEEE 754-2008标准的浮点类型。按占据空间大小区分,分别为 f32和f64,其使用方法与整型差别不大。浮点数字面量表示方式有如下几种:
输出结果为:

let f1 = 123.0f64;
let f2 = 0.1f64;
let f3 = 0.1f32;
let f4 = 12E+99_f64;
let f5 : f64 = 2.;
// type f64
// type f64
// type f32
// type f64 科学计数法 // type f64
与整数类型相比,Rust的浮点数类型相对复杂得多。浮点数的麻烦之处在于: 它不仅可以表达正常的数值,还可以表达不正常的数值。
在标准库中,有一个std::num::FpCategory枚举,表示了浮点数可能的状 态:
enum FpCategory {
Nan,
Infinite,
Zero,
Subnormal,
Normal,
}
其中Zero表示0值、Normal表示正常状态的浮点数。其他几个就需要特别解释 一下了。
在IEEE 754标准中,规定了浮点数的二进制表达方式:x=(-1)^s*(1+M) *2^e。其中s是符号位,M是尾数,e是指数。尾数M是一个[0,1)范围内的二进制 表示的小数。以32位浮点为例,如果只有normal形式的话,0表示为所有位数全0, 则最小的非零正数将是尾数最后一位为1的数字,就是(1+2^(-23)) *2(-127),而次小的数字为(1+2(-22))*2^(-127),这两个数字的差距为 2(-23)*2(-127)=2^(-150),然而最小的数字和0之间的差距有 (1+2(-23))*2(-127),约等于2^(-127),也就是说,数字在渐渐减少到0 的过程中突然降到了0。为了减少0与最小数字和最小数字与次小数字之间步长的突 然下跌,subnormal规定:当指数位全0的时候,指数表示为-126而不是-127(和指 数为最低位为1一致)。然而公式改成(-1)s*M*2e,M不再+1,这样最小的数 字就变成2(-23)*2(-126),次小的数字变成2(-22)*2(-126),每两个相 邻subnormal数字之差都是2(-23)*2(-126),避免了突然降到0。在这种状态 下,这个浮点数就处于了Subnormal状态,处于这种状态下的浮点数表示精度比 Normal状态下的精度低一点。我们用一个示例来演示一下什么是Subnormal状态的 浮点数:
fn main() {
// 变量 small 初始化为一个非常小的浮点数
let mut small = std::f32::EPSILON;
// 不断循环,让 small 越来越趋近于 0,直到最后等于0的状态 while small > 0.0 {
small = small / 2.0;
println!(“{} {:?}”, small, small.classify());
}
}
编译,执行,发现循环几十次之后,数值就小到了无法在32bit范围内合理表达 的程度,最终收敛到了0,在后面表示非常小的数值的时候,浮点数就已经进入了 Subnormal状态。
Infinite和Nan是带来更多麻烦的特殊状态。Infinite代表的是“无穷大”,Nan代表 的是“不是数字”(not a number)。

什么情况会产生“无穷大”和“不是数字”呢?举例说明:
fn main() {
let x = 1.0f32 / 0.0;
let y = 0.0f32 / 0.0;
println!(“{} {}”, x, y);
}
编译执行,打印出来的结果分别为inf NaN。非0数除以0值,得到的是inf,0除 以0得到的是NaN。
对inf做一些数学运算的时候,它的结果可能与你期望的不一致:
fn main() {
let inf = std::f32::INFINITY;
println!(“{} {} {}”, inf * 0.0, 1.0 / inf, inf / inf);
}
NaN 0 NaN
NaN这个特殊值有个特殊的麻烦,主要问题还在于它不具备“全序”的特点。示 例如下:
fn main() {
let nan = std::f32::NAN;
println!(“{} {} {}”, nan < nan, nan > nan, nan == nan);
}
false false false
这就很麻烦了,一个数字可以不等于自己。因为NaN的存在,浮点数是不具 备“全序关系”(total order)的。关于“全序”和“偏序”的问题,本节就不展开讲解 了,后面讲到trait的时候,再给大家介绍PartialOrd和Ord这两个trait。

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

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

相关文章

欧拉回路和欧拉路径

在一张图中&#xff0c;从一个点出发每条边经过且只经过一次得到的路径&#xff0c;如果最后回到起点&#xff0c;那么就是欧拉回路&#xff0c;如果最后没有回到起点&#xff0c;那么得到的就是欧拉路径。 在无向图中&#xff0c;欧拉路径满足的要求是&#xff0c;除了起点和…

DM数据库学习之路(十六)DEM部署DM8DPC集群

DEM部署DPC集群 DPC准备工作 在所有安装DPC服务器上部署dmagent&#xff0c;dmagent的运行环境需要依赖JAVA环境&#xff0c;JAVA版本必须为JAVA1.8。 创建用户 所有安装DPC服务器&#xff0c;手工建dmdba用户 # groupadd dinstall # useradd -g dinstall -d /home/dmdba…

并发编程之深入理解Java线程

并发编程之深入理解Java线程 线程基础知识 线程和进程 进程 程序由指令和数据组成、但这些指令要运行&#xff0c;数据要读写&#xff0c;就必须要将指令加载至CPU、数据加载至内存。在指令运行过程中还需要用到磁盘、网络等设备。进程就是用来加载指令、管理内存、管理IO的…

Jmeter内置变量 vars 和props的使用详解

JMeter是一个功能强大的负载测试工具&#xff0c;它提供了许多有用的内置变量来支持测试过程。其中最常用的变量是 vars 和 props。 vars 变量 vars 变量是线程本地变量&#xff0c;它们只能在同一线程组内的所有线程中使用&#xff08;线程组内不同线程之间变量不共享&#…

模型转换案例学习:等效替换不支持算子

文章介绍 Qualcomm Neural Processing SDK &#xff08;以下简称SNPE&#xff09;支持Caffe、ONNX、PyTorch和TensorFlow等不同ML框架的算子。对于某些特定的不支持的算子&#xff0c;我们介绍一种算子等效替换的方法来完成模型转换。本案例来源于https://github.com/quic/qidk…

并发编程(2)基础篇-管程

4 共享模型之管程 本章内容 共享问题synchronized线程安全分析Monitorwait/notify线程状态转换活跃性Lock 4.1 共享带来的问题 4.1.1 小故事 老王&#xff08;操作系统&#xff09;有一个功能强大的算盘&#xff08;CPU&#xff09;&#xff0c;现在想把它租出去&#xff…

基础小白快速入门Python->Python中的类

什么是类&#xff1f; 在编程语言中&#xff0c;类&#xff08;Class&#xff09;是一个用于创建对象的蓝图或模板。它定义了对象的属性&#xff08;也称为成员变量&#xff09;和方法&#xff08;也称为成员函数&#xff09;。类是面向对象编程&#xff08;OOP&#xff09;的…

2024 全国水科技大会暨第二届智慧水环境管理与技术创新论坛

论坛二&#xff1a;第二届智慧水环境管理与技术创新论坛 召集人&#xff1a;刘炳义 武汉大学智慧水业研究所所长、教授 为贯彻落实中共中央国务院印发《数字中国建设整体布局规划》和国务院关于印发《“十四五”数字经济发展规划》的通知&#xff0c;推动生态环境智慧治理&…

L2 清点代码库----PTA(疑问)

上图转自新浪微博&#xff1a;“阿里代码库有几亿行代码&#xff0c;但其中有很多功能重复的代码&#xff0c;比如单单快排就被重写了几百遍。请设计一个程序&#xff0c;能够将代码库中所有功能重复的代码找出。各位大佬有啥想法&#xff0c;我当时就懵了&#xff0c;然后就挂…

docker pullpush 生成镜像文件并push 到阿里云

pull docker docker pull ultralytics/ultralytics # 拉取yolov8的镜像仓库 docker run -it ultralytics/ultralytics # 运行镜像 conda create -n gsafety python3.8 # 创建环境 source activate gsafety # 激活环境 pip install -i https://pypi.tuna.tsinghua.edu.cn/simp…

糖尿病性视网膜病变(DR)的自动化检测和分期

糖尿病性视网膜病变&#xff08;DR&#xff09;的自动化检测和分期 提出背景DR的阶段及其特征 历年解法计算机视觉方法多分类方法 新的解法深度学习方法迁移学习大模型多模型集成全流程分析 总结特征1&#xff1a;图像分割特征2&#xff1a;疾病分级特征3&#xff1a;治疗建议生…

开源模型应用落地-工具使用篇-获取文本向量(五)

一、前言 在之前学习的"开源模型应用落地-工具使用篇"系列文章中&#xff0c;我们已经学会了如何使用向量数据库。然而&#xff0c;还有一个问题一直未解决&#xff0c;那就是如何处理文本向量。在本文中&#xff0c;我们将继续深入学习关于向量的知识&#xff0c;特…

Redis的哨兵系统

Redis 哨兵&#xff08;Sentinel&#xff09;系统是一种用于管理多个 Redis 服务器的系统&#xff0c;其主要目标是提供监控、通知、自动故障转移和服务发现功能。哨兵系统能够在 Redis 实例出现问题时自动进行故障转移&#xff0c;确保系统的高可用性。其工作原理如下&#xf…

常见消息中间件

ActiveMQ 我们先看ActiveMQ。其实一般早些的项目需要引入消息中间件&#xff0c;都是使用的这个MQ&#xff0c;但是现在用的确实不多了&#xff0c;说白了就是有些过时了。我们去它的官网看一看&#xff0c;你会发现官网已经不活跃了&#xff0c;好久才会更新一次。 它的单机吞…

2024年学习的最高薪酬编程语言

2024年学习的最高薪酬编程语言 10. Scala Scala是一种在Java虚拟机&#xff08;JVM&#xff09;上运行的函数式编程语言。它通常用于大数据处理、机器学习和后端Web开发。 关于Scala编程语言及其常见用途的要点如下&#xff1a; Scala是一种通用编程语言&#xff0c;运行在J…

mac真的安装不了vmware吗 mac如何安装crossover crossover序列号从哪里买 购买正版渠道

有些用户可能想在mac上运行一些只能在windows上运行的软件&#xff0c;比如游戏、专业软件等。这时候&#xff0c;就需要用到虚拟机技术&#xff0c;也就是在mac上安装一个可以模拟其他操作系统的软件&#xff0c;比如vmware或者crossover。那么&#xff0c;mac真的安装不了vmw…

2024年华为OD机试真题-贪心歌手-Python-OD统一考试(C卷)

题目描述: 一个歌手准备从A城去B城参加演出。 1) 按照合同,他必须在T天内赶到。 3) 歌手不能往回走。 4) 每两座城市之间需要的天数都可以提前获知。 5) 歌手在每座城市都可以在路边卖唱赚钱。经过调…

【前端素材】推荐优质后台管理系统Xoric平台模板(附源码)

一、需求分析 当我们从多个层次来详细分析后台管理系统时&#xff0c;可以将其功能和定义进一步细分&#xff0c;以便更好地理解其在不同方面的作用和实际运作。 1. 功能层次 a. 用户管理功能&#xff1a; 用户注册和登录&#xff1a;管理用户账户的注册和登录过程。权限管…

K8S故障处理指南:网络问题排查思路

1. 前言 对于私有化环境&#xff0c;客户的网络架构&#xff0c;使用的云平台存在着各种差异&#xff0c;K8S网络可能会出现各种问题&#xff0c;此文着重讲解遇到此种问题的排查方法和思路&#xff0c;不会涉及相关网络底层技术描述. 环境说明 由于我们的k8s网络组件默认使…

5.网络游戏逆向分析与漏洞攻防-游戏网络架构逆向分析-测试需求与需求拆解

内容参考于&#xff1a;易道云信息技术研究院VIP课 上一个内容&#xff1a;模拟游戏登陆器启动游戏并且完成注入 首先正常分析软件程序有没有漏洞&#xff0c;需要通过它的操作侵入&#xff0c;比如买东西&#xff0c;就通过买东西的按钮它背后有源代码就看源代码&#xff0c…