Unity 浮点数的精度问题

文章目录

  • 前言
  • 一、精度问题
    • 1、数值不相等
    • 2、数值计算不确定
    • 3、不同设备计算结果不同
  • 二、解决方法:
  • 总结


前言

说到浮点数精度,大家想到的就是double比float的精度高,想要高精度就用double类型。两者最明显的区别就是所占位数的不同,也就是字节不同,float是32位占8字节,double则是64位占8字节。因此,运算效率也不同。


一、精度问题

为什么会有精度问题呢?计算机只能存0和1,让计算机存储1/3这种无限循环小数在二进制中无法精确表示。因此,计算机在存储1/3这样的数据时会进行近似处理,导致在一定精度范围内的误差。

计算机在记录浮点数时通常采用 IEEE 754 标准。这个标准定义了浮点数的存储格式和算术运算规则。每个浮点数通常由三部分组成:符号位(表示正负)、尾数(表示有效数字)和指数(表示数值的数量级)。根据这个标准,浮点数的存储格式是二进制的,采用科学计数法表示。符号位决定了数值的正负,尾数和指数组合在一起确定了数值的精度和范围。

1、数值不相等

不知道大家遇到过阈值触发逻辑的时候,实用全等号(==)判断浮点数会出现不准确的问题,比如在值等于0.545的时候出发逻辑a,值会不断增加减少,但每次增加的值小于0.01,实际数值根本对不上0.545这个数,要么大要么小。解决办法可能是实用大于、小于符号,但是结果并不准确。如果想稳妥的解决可以使用绝对值控制浮动区间,减少误差,也就是ABS(X-Y)<0.00001。

2、数值计算不确定

在计算机中,浮点数的表示是有限的,因此在执行某些计算时,可能会出现舍入误差。举个例子,假设你有三个变量:( x = 1f ),( y = 2f ),( z=(1f /5555f)×11 110f)。

现在,假设你有一个条件判断,要求当 x/z<0.5f时执行某些操作。从逻辑上来说,你可能会认为 ( \frac{x}{z} ) 也应该满足这个条件,因为你把 ( z ) 视为等同于 ( y ),即等于2。然而,在计算机内部,由于浮点数的位数限制,( z ) 的计算结果可能是接近但不完全等于2的数,例如0.4999999999991。当然,也可能会得到一个大于0.5的结果,而不符合你的预期。这种情况会导致外层条件判断为真,但内层条件判断为假,造成程序的异常行为。在编写代码时,需要特别注意浮点数的精度问题,并谨慎处理条件判断,以避免出现意外的结果。

3、不同设备计算结果不同

因为不同平台的浮点数计算方式不同,结果也会有所区别。

二、解决方法:

(1)使用一台计算机计算,只计算一次,将其作为这次结果。通常在前后端同步时使用,客户端的结果由服务器进行结算,客户端进行展示效果。实际中更复杂些。
(2)计算时使用int或long,在显示时显示浮点数。
(3)实用定点数,因为定点数整数和小数部分数分开的,可以都看作整数。我们在计算时重载运算符,进行计算即可;只是其中涉及到部分数学运算,不是计科类的专业整理学习时间可能较长,不过Git上有不少已经写好的方案,可以拿来学习和修改。
(4)使用string字符串进行计算,精度需求很大的时候才会使用,可以控制精度,但十分消耗性能。


总结

浮点数精度问题是计算机中普遍存在的挑战。由于计算机存储和计算的限制,浮点数在进行运算时往往会产生舍入误差,导致结果不够准确。为了解决这个问题,我们可以采取一些策略,如控制精度、使用定点数等。在程序开发中,需要特别注意处理浮点数的精度,以确保程序的正确性和稳定性。

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

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

相关文章

java驱动bat脚本执行mysql恢复备份根据自定义mysql备份名

我有个需求&#xff0c;需要根据mysql备份的地址&#xff0c;恢复mysql数据 就是说我把sql备份了&#xff0c;然后需要通过java代码触发执行恢复的mysql脚本&#xff0c;但是需要传一个备份的路径 直接上代码 java代码如下&#xff1a; public static void main(String[] a…

22 | MySQL有哪些“饮鸩止渴”提高性能的方法?

短连接风暴 第一种方法:先处理掉那些占着连接但是不工作的线程。 kil id 第二种方法:减少连接过程的消耗。 让数据库跳过权限验证阶段,重启数据库,并使用–skip-grant-tables 参数启动。 慢查询性能问题 索引没有设计好 创建索引都支持 Online DDL 了,对于那种高峰期数…

hexo 博客插入本地图片时遇到的坑

哈喽大家好&#xff0c;我是咸鱼。 最近一直在折腾博客的事&#xff0c;说是 hexo 极易上手&#xff0c;我觉得只仅限于在安装部署的时候&#xff0c;随着对 hexo 的深入使用&#xff0c;发现遇到的问题还是挺多的。 那今天来讲一下我在把本地图片插入到 hexo 博客文章中遇到…

树莓派4b红外检测

1.红外检测连接图 2.红外检测工作原理 红外传感器的工作原理类似于物体检测传感器。该传感器包括一个红外LED和一个红外光电二极管&#xff0c;因此通过将这两者结合起来&#xff0c;可以形成一个光耦合器。 红外LED是一种发射红外辐射的发射器。该LED看起来与标准LED相似&a…

Games101-动画与模拟(求解常微分方程,刚体与流体)

Single Particle Simulation 规定了任何一个物体任何时刻的速度&#xff0c;知道它的初始位置&#xff0c;求它某个时间后的位置&#xff1f; 如果一个物体是匀速直线运动&#xff0c;用初始位置加上速度和时间的乘积即可 如上图&#xff0c;如果想描述一个粒子在一个速度场&am…

JAVA中的泛型、file类、IO流

泛型 什么是&#xff1a; 1、定义时通过一个标识&#xff0c;表示类型&#xff1b;2、Jdk5.0之后添加的 没有会造成的问题&#xff1a; 1、类型不安全&#xff1b; 2、强制转换比较繁琐&#xff1b; 1、E&#xff1a; list中使用&#xff1b;用指定的类型去替换E&#xff…

ASP.NET小型企业办公耗材库存管理软件的设计与实现

摘 要 库存管理系统是将企业的存和转等企业的经营业务有机的结合起来&#xff0c;达到数据共享、降低成本、提高效率。本系统前台采用.NET,后台数据库采用SQL Server 2000&#xff0c;语言采用C#。本系统实现的主要功能有库存查询、进货作业、领料作业、库存盘点、损坏处理等…

【shell】shell利用随机数生成指定范围的随机数及随机获取数组中元素

shell默认内置环境变量RANDOM echo $RANDOM 生成1~9的随机数 echo $RANDOM%91 %后面是多少&#xff0c;就是最大是多少 随机获取数组中的一个元素 array"3 4 44 8" random$(($RANDOM%41)) echo random:$random j0 for i in $array dojexpr $j 1if [ "$j&…

【平台开发】MTK6833——cache操作记录

CPU Cache 用的是一种叫 SRAM&#xff08;Static Random-Access Memory&#xff0c;静态随机存储器&#xff09; 的芯片。 通常分为L1&#xff0c;L2&#xff0c;L3三层缓存。 CPU 并不会直接和每一种存储器设备直接打交道&#xff0c;而是每一种存储器设备只和它相邻的存储器…

Linux---HTTP协议

HTTP HTTP协议&#xff08;Hypertext Transfer Protocol&#xff0c;超文本传输协议&#xff09;是一种应用层协议&#xff0c;主要用于在Web浏览器和Web服务器之间传输数据。 一、认识URL 平时我们俗称的 " 网址 " 其实就是说的 URL http请求样例 看起来是一行一…

ubuntu20文件安装和卸载cuda11.6

搜索cuda 11.6 nvidia&#xff0c;进入官网https://developer.nvidia.com/cuda-11-6-0-download-archive 选择linux --> runfile 用安装包安装 wget https://developer.download.nvidia.com/compute/cuda/11.6.0/local_installers/cuda_11.6.0_510.39.01_linux.run sudo s…

uniapp 小程序图片懒加载组件 ImageLazyLoad

预览图 组件【ImageLazyLoad】代码 <template><viewclass"image-lazy-load":style"{opacity: opacity,borderRadius: borderRadius rpx,background: background,transition: opacity ${time / 1000}s ease-in-out,}":class"image-lazy-loa…

MySQL中的批量更新实战

MySQL中的批量更新实战 表结构 mysql> desc dept; --------------------------------------------------------- | Field | Type | Null | Key | Default | Extra | --------------------------------------------------------- | deptno | int(11) …

第二代增强-采购订单抬头子屏幕增强

文章目录 第二代增强-采购订单抬头子屏幕增强需求查找增强点创建项目增强子屏幕定义全局变量编写出口函数代码激活增强运行结果查看创建的采购订单底表数据 第二代增强-采购订单抬头子屏幕增强 需求 查找增强点 创建项目 增强子屏幕 定义全局变量 *&---------------------…

读书笔记——《高质量C++/C编程指南》(2)

目录 前言 命名规则 共性规则 简单的Windows应用程序命名规则 表达式和基本语句 运算符优先级 复合表达式 if语句 布尔变量与零值比较 整型变量与零值比较 浮点变量与零值比较 指针变量与零值比较 对if 语句的补充说明 循环语句的效率 for 语句的循环控制变量 s…

自动驾驶中常见坐标系极其转换

各个传感器坐标系 相机坐标系统 摄像头的作用是把三维世界中的形状、颜色信息,压缩到一张二维图像上。基于摄像头的感知算法则是从二维图像中提取并还原三维世界中的元素和信息,如车道线,车辆、行人等,并计算他们与自己的相对位置。 感知算法和相机相关的坐标系有图像坐…

Pandas进阶

文章目录 第1关&#xff1a;Pandas 分组聚合第2关&#xff1a;Pandas 创建透视表和交叉表 第1关&#xff1a;Pandas 分组聚合 编程要求 使用 Pandas 中的 read_csv() 函数读取 step1/drinks.csv 中的数据&#xff0c;数据的列名如下表所示&#xff0c;请根据 continent 分组并…

MySQL-ELK基础

1&#xff1a;什么是 ELK ELK是由一家elastic公司开发的三个开源项目的首字母缩写&#xff0c;这三个项目分别是&#xff1a;Elasticsearch、Logstash 和 Kibana。三个项目各有不同的功能&#xff0c;之后又增加了许多新项目, 于是 从5.X版本后改名为Elastic Stack Elastic S…

【JavaScript】内置对象 - Date 日期对象 ④ ( 制作倒计时页面 )

文章目录 一、倒计时页面实现1、需求分析2、计算秒数3、计算倒计时时间的 天 / 时 / 分 / 秒4、页面中显示倒计时时间 二、完整代码示例1、完整代码2、执行结果 Date 日期对象参考文档 : https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Da…

晨华城乡社区网格化建设实施

一、目标任务 开展社会服务网格化管理工作的目标是为了实现基层社会治理管理体系全覆盖。全面形成指挥有力、协调顺畅、运转高效的运行体系&#xff0c;普遍建立覆盖城乡、行为规范、富有活力的组织网络&#xff0c;建立健全服务民生、维护稳定、推动发展的制度机制&#xff0…