精度 Precision
柏拉图认为,尽管世间万物是不完美的,但存在一种永恒不变的形式,这个形式是完美的,而生命的意义就是让这个世界尽可能的接近这个完美的形式。
怎么理解这句话,和我们今天讲的精度有什么关系。我们先举一个例子,方便大家的理解。比如一个圆,对应的数学形式为:
相信大家都不会否认这个公式很优雅,真的可以用完美无瑕来形容了。现在画出来,去其中的一段圆弧,你就意识到,要达到形式上的完美,步步维艰。
可见,在现实生活中不存在绝对的完美,总有更高的标准,让它变得完美。对应到数字上,不完美就是精度的损失。当然,这种损失是不可避免的,甚至是有益的,首先,它能降低成本,比如有损压缩技术。其次,也有助于我们对事物的理解,比如地球是一个不规则球体,我们会认为它是一个椭球,甚至会进一步简化,认为它是一个圆球。
这就有了矛盾点,精度损失本来是一件坏事,怎么让你三言两语说成了一件好事。问题的症结就在于我们对“形式”的理解深度,帮助我们更好的取舍,当我们合理的评估这种精度的损失,达到刚刚好的平衡,也是一种退而求其次的完美。
上一节我们讲了球心坐标和本地坐标之间的转换,这里也有一个精度的问题。假设赤道上相距1米的两个点之间的delta,如果是球心坐标,我们用经纬度来表示的话,地球半径R为6378137米,两点之间的经度差为x,推算如下。而我们采用以其中一点为原点的本地坐标时,两点之间的差就是1米(b)。
两个答案哪一个更准确。分为三种情况,一部分人认为答案a详细准确,比如我们在星战类电影里面都会有一个画面,舰长说,距离地球还有多远,总会有一个人说出一串长长的的数字,让人觉得准确无误;一部分人认为答案b简单准确;还有一部分人认为,两者一样准确。确实,两个答案都是通过数学公式推到出来的,理论上讲可以做到一样准确,但从程序员的角度,浮点型是有精度损失,这是浮点型的存储规范导致的,通常精度能够满足多数需求,但一旦满足不了,损失是巨大的,而且难发现难解决。比如哥伦比亚号爆炸,就是因为double精度问题导致。
浮点型格式
这部分之前做过一个视频,可以在百度搜索:[编程]1 C++类型简析,会有详细介绍。如果不想花时间,只需要记住,float可以有7位有效数字,而double可以有16位,选择合适的浮点类型,当你的精度需求超过这个范围时,你就要小心了。
相机抖动
如果精度达不到要求,怎么办?不妨把原点换到一个相对近的位置,这样就可以大大提高精度。这不就是坐标转换的意义吗?
通常,我们都会有一个基准点,保证它是准确的,周边的物体都是相对该基准点的位置,成为RTC,Relative to centre。但在Virtual Earth中,如果我们近地面浏览,RTC-rendering还是会出现浏览范围超过float精度的情况,就会出现精度的丢失,也就是相机抖动。
这里有两个步骤,第一将RTC改为RTE(eye),以前以某一个事先约定的中心点为基准点,在浏览中,总会出现偏离该点的情况,越远精度损失就越大,这时我们改为以相机位置为中心点有机会在介绍相关的推导,模型试图矩阵,法向量等相机矩阵推导后续会专门介绍。当距离物体非常近时,采用RTE的坐标转换会更精确。
同时,因为shader中仅支持float类型,这里,Cesium提供了一种编码方式,用float-float模拟一个double,来确保精度问题,对应EncodedCartesian3.encode方法。这样,通过一个high的float和一个low的float,分别运算,解决抖动的问题,也算是GPU之duoble运算的一种思路吧。
本文主要介绍了我对精度的理解,float精度为何会有损失,以及RTC和RTE解决相机抖动的思路,因为孩子发烧,无能为力,夜不能寐,索性写写文章,聊以自慰,因而写的过程比较压抑。
可怜下父母心,希望儿子早日康复。
精度 Precision的更多相关文章
- 设置浮点数的显示精度&precision(0)
/* 设置浮点数的显示精度 cout.precision(int)可以设置浮点数的显示精度(不包括小数点) 注: 1.如果设置的精度大于浮点数的位数,如果浮点数能根据IEEE ...
- OpenGL ES 2.0 符点精度
片元着色器中使用符点相关类型的变量时与顶点着色器中有所不同,在顶点着色器中直接声明使用即可,而在片元着色器中必须指定精度. lowp 低 mediump 中 highp 高 指定整个着色器中符点相关类 ...
- PHP中的浮点精度和类型
PHP中的浮点数 精度 在PHP中,浮点数的字长和平台相关,通常最大值是 1.8e308 并具有 14 位十进制数字的精度(64 位 IEEE 格式). 浮点数的精度有限.尽管取决于系统,PHP 通常 ...
- PHP_保留两位小数并且四舍五入(可用于精度计算)_保留两位小数并且不四舍五入
小数例子: PHP保留两位小数并且四舍五入 1 $n=0.1265489; 2 echo sprintf("%.2f", $n); // 0.13 大家可以看到我们用到了sprin ...
- 机器学习classification_report方法及precision精确率和recall召回率 说明
classification_report简介 sklearn中的classification_report函数用于显示主要分类指标的文本报告.在报告中显示每个类的精确度,召回率,F1值等信息. 主要 ...
- 查准率与查全率(precision and recall) 的个人理解
假设要识别照片中的狗的,在一些照片中,包含12只狗的照片和一些猫的照片.算法识别出有8只狗.在确定的8只狗中,5只实际上是狗(真阳性TP),而其余的是猫(假阳性FP).该程序的精度为5/8,而其召回率 ...
- 评价指标的计算:accuracy、precision、recall、F1-score等
记正样本为P,负样本为N,下表比较完整地总结了准确率accuracy.精度precision.召回率recall.F1-score等评价指标的计算方式: (右键点击在新页面打开,可查看清晰图像) 简单 ...
- mAP(mean Average Precision)应用(转)
原文章地址来自于知乎:https://www.zhihu.com/question/41540197 1. precision 和 recall 的计算(没什么好说的,图片示例相当棒): 图1 图中上 ...
- JPEG文件结构
JPEG文件由八个部分组成,每个部分的标记字节为两个,首字节固定为:0xFF,当然,准许在其前面再填充多个0xFF,以最后一个为准.下面为各部分的名称和第二个标记字节的数值,用ultraedit的16 ...
随机推荐
- 菜鸟入门【ASP.NET Core】14:MVC开发:UI、 EF + Identity实现、注册实现、登陆实现
前言 之前我们进行了MVC的web页面的Cookie-based认证实现,接下来的开发我们要基于之前的MvcCookieAuthSample项目做修改. MvcCookieAuthSample项目地址 ...
- 通过示例学习JavaScript闭包
译者按: 在上一篇博客,我们通过实现一个计数器,了解了如何使用闭包(Closure),这篇博客将提供一些代码示例,帮助大家理解闭包. 原文: JavaScript Closures for Dummi ...
- 通过JS生成由字母与数字组合的随机字符串
在项目中可能需要随机生成字母数字组成的字符,如生成3-32位长度的字母数字组合的随机字符串(位数不固定)或者生成43位随机字符串(位数固定) 使用Math.random()与toString()方法的 ...
- day11(python)装饰器
def wrapper(f):#1 def inner(*args,**kwargs):#3 ret = f(*args,**kwargs)#5 return ret#8 return inner#4 ...
- codeforces 735C Tennis Championship(贪心+递推)
Tennis Championship 题目链接:http://codeforces.com/problemset/problem/735/C ——每天在线,欢迎留言谈论. 题目大意: 给你一个 n ...
- go 开发中需要注意的与python的不同点
从python转golang开发已经3个月了,因为写过c++,所以对golang接受的还算快,这段经历也不是很痛苦.伯乐在线上看了一些大神关于python转golang过程中的不适应和吐槽,决定写下篇 ...
- 惰性求值——lodash源码解读
前言 lodash受欢迎的一个原因,是其优异的计算性能.而其性能能有这么突出的表现,很大部分就来源于其使用的算法--惰性求值. 本文将讲述lodash源码中,惰性求值的原理和实现. 一.惰性求值的原理 ...
- 使用Visual Studio Team Services持续集成(一)——构建ASP.NET Core
使用Visual Studio Team Services持续集成(一)--构建ASP.NET Core 概述 持续集成(CI)是将代码尽可能频繁地集成到共享仓库中的过程.在代码集成期间,构建中断或测 ...
- telnet 测试网站是否开启长连接
测试服务器是否开启keepalive(长连接) telnet 主机名(域名|IP) 80 #发起请求GET /index.html HTTP/1.1Host: www.cbnsc.com 如果请求完后 ...
- 第八章 Hyper-V 2012 R2 故障转移群集
和终端用户相比,企业用户对于业务的连续性和可靠性更为在意.相对而言,企业一般不会将追逐单一硬件的性能排在第一位. 如何衡量业务是否持续可用,一般使用"x 个 9"这种方式来定义.如 ...