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.mfbz.cn/a/603653.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

某云eHR PtFjk.mob 任意文件上传漏洞复现

0x01 产品简介 某云eHR是大中型企业广泛采用人力资源管理系统。某云是国内顶尖的HR软件供应商,是新一代eHR系统的领导者。 0x02 漏洞概述 某云EHR系统PtFjk.mob接口处存在未授权文件上传漏洞,攻击者可上传webshell来命令执行,获取服务器权限。 0x03 复现环境 FOFA:bod…

算法-并查集

目录 什么是并查集 并查集基础 &#xff08;1&#xff09;原理 &#xff08;2&#xff09;初始化 &#xff08;3&#xff09;查询 &#xff08;4&#xff09;合并 &#xff08;5&#xff09;判断是否同一集合 并查集优化 路径压缩 启发式合并 并查集模板 模板 例题…

线下订单平台操作步揍

收款管理 1微信收款查询 1. 获取微信数据 获取微信数据。通过时间范围 查找微信数据调用第三方接口如下&#xff1a; Map map HttpPost.doPost("https://qyapi.weixin.qq.com/cgi-bin/externalpay/get_bill_list?access_token"ApiUtils.getWxtoken(),args); 其中…

如何缩小图片尺寸不改变清晰度?几个方法教你解决

在平时对图片进行处理的时候&#xff0c;最害怕的就是修改过的图片质量下降&#xff0c;导致清晰度不够&#xff0c;尤其是缩小图片尺寸的时候&#xff0c;所以今天小编就来告诉大家几个关于修改图片尺寸又不改变清晰度的方法。 修改图片大小是非常普遍的图片编辑需求&#xf…

【SpringMVC 】什么是SpringMVC(三)?基于springmvc的文件上传、基于springmvc的拦截器、基于springmvc的邮件发送

文章目录 SpringMVC第五章1、SpringMVC文件上传1、基本步骤1-2345-82、邮件发送1、基本步骤1-234-5567-8 简单邮件带附件的邮件第六章1、拦截器的使用使用步骤232、调度的使用基本步骤1-56-8调度规则3、shiro安全框架核心概念基本语法1、基于ini文件的认证**测视类**2、基于rea…

计算机组成原理网课笔记

无符号整数的表示与运算 带符号整数的表示与运算 原反补码的特性对比 移码

基于 docker-compose 部署 LNMP 架构

目录 前言 1、任务要求 2、Nginx 2.1 建立工作目录并上传相关安装包 2.2 编写 Nginx Dockerfile 脚本 2.3 准备 nginx.conf 配置文件 3、Mysql 3.1 建立工作目录并上传相关安装包 3.2 编写 Mysql Dockerfile 脚本 3.3 编写 my.cnf 配置文件 4、PHP 4.1 建立工作目录…

Spring MVC(一)

1 Spring MVC概述 我们在之前学习Servlet的时候&#xff0c;认识了在WEB开发中MVC设计模式&#xff0c;其最为经典的设计就是&#xff0c;通过控制器&#xff08;Controller&#xff09;分离模型&#xff08;Model&#xff09;和视图&#xff08;View&#xff09;。在具体的WEB…

提高谷歌抓取成功率:代理IP的7个使用误区

在当今数字化时代&#xff0c;数据采集和网络爬取已成为许多企业和个人必不可少的业务活动。对于爬取搜索引擎数据&#xff0c;特别是Google&#xff0c;使用代理IP是常见的手段。然而&#xff0c;使用代理抓取Google并不是一件轻松的事情&#xff0c;有许多常见的误区可能会导…

在IDEA中通过模块创建新项目的时候,出现无法连接的错误

1.找到IDEA中的设置 2.在设置搜索HTTP,选择自动检测代理设置 选择URL: 输入https://start.spring.io 3.点击应用&#xff0c;即可完成

面试算法-链表-反转链表(golang、c++)

目录 1、题目 2、解题思路 2.1 遍历、迭代 2.2 递归 3、源代码 3.1 c 3.2 golang 4、复杂度分析 4.1 遍历、迭代法 4.2 迭代法 1、题目 链表是一种常用的数据结构&#xff0c;链表的特点是插入、删除节点的效率非常高&#xff0c;因为他不需要移动其他任何元素&…

nginx--防盗链

盗链 通过在自己网站里面引用别人的资源链接,盗用人家的劳动和资源 referer referer是记录打开一个页面之前记录是从哪个页面跳转过来的标记信息 正常的referer信息 none&#xff1a;请求报文首部没有referer首部&#xff0c;比如用户直接在浏览器输入域名访问web网站&…

使用 Cython 加密 Python 代码防止反编译

文章目录 前言使用 Cython 加密 Python 代码环境Python 源代码编写 Cython 编译配置文件 编译查看输出文件使用 问题error: Microsoft Visual C 14.0 or greater is requiredpyconfig.h(59): fatal error C1083: 无法打开包括文件: “io.h”: No such file or directorydynamic…

【已解决】‘pip‘ 不是内部或外部命令问题

&#x1f60e; 作者介绍&#xff1a;我是程序员行者孙&#xff0c;一个热爱分享技术的制能工人。计算机本硕&#xff0c;人工制能研究生。公众号&#xff1a;AI Sun&#xff0c;视频号&#xff1a;AI-行者Sun &#x1f388; 本文专栏&#xff1a;本文收录于《AI实战中的各种bug…

大模型微调之 在亚马逊AWS上实战LlaMA案例(三)

大模型微调之 在亚马逊AWS上实战LlaMA案例&#xff08;三&#xff09; 使用 QLoRA 增强语言模型&#xff1a;Amazon SageMaker 上 LLaMA 2 的高效微调 语言模型在自然语言处理任务中发挥着关键作用&#xff0c;但训练和微调大型模型可能会占用大量内存且耗时。在本文中&…

Springboot整合飞书向群组/指定个人发送消息/飞书登录

Springboot整合飞书向群组发送消息 飞书开放平台创建企业自建应用 添加应用能力-机器人 创建完成后&#xff0c;进入应用详情页&#xff0c;可以在首页看到 App Id 和 App Secret 在飞书pc端创建一群机器人 此处可以拿到该机器人的webhook地址,通过https的方式,也可以调用发送…

为什么说RK3562可以碾压PX30?

在如今的科技市场中&#xff0c;处理器的性能直接决定了设备的运行速度和用户体验。今天&#xff0c;我们将对比瑞芯微旗下的两款处理器&#xff1a;PX30与RK3562。RK3562比PX30的性价比究竟高在哪里&#xff1f; PX30 瑞芯微PX30是一款高性能的四核应用处理器&#xff0c;专…

Android单行字符串末尾省略号加icon,图标可点击

如图 设置仅显示单行字符串&#xff0c;末尾用省略号&#xff0c;加跟一个icon&#xff0c;icon可点击 tvName.text "test"val drawable ResourcesCompat.getDrawable(resources, R.mipmap.icon_edit, null)tvName.setCompoundDrawablesWithIntrinsicBounds(null,…

故障——蓝桥杯十三届2022国赛大学B组真题

问题分析 这道题纯数学&#xff0c;考察贝叶斯公式 AC_Code #include <bits/stdc.h> using namespace std; typedef pair<int,double> PI; bool cmp(PI a,PI b){if(a.second!b.second)return a.second>b.second;return a.first<b.first; } int main() {i…
最新文章