柏拉图认为,尽管世间万物是不完美的,但存在一种永恒不变的形式,这个形式是完美的,而生命的意义就是让这个世界尽可能的接近这个完美的形式。

怎么理解这句话,和我们今天讲的精度有什么关系。我们先举一个例子,方便大家的理解。比如一个圆,对应的数学形式为:

相信大家都不会否认这个公式很优雅,真的可以用完美无瑕来形容了。现在画出来,去其中的一段圆弧,你就意识到,要达到形式上的完美,步步维艰。

可见,在现实生活中不存在绝对的完美,总有更高的标准,让它变得完美。对应到数字上,不完美就是精度的损失。当然,这种损失是不可避免的,甚至是有益的,首先,它能降低成本,比如有损压缩技术。其次,也有助于我们对事物的理解,比如地球是一个不规则球体,我们会认为它是一个椭球,甚至会进一步简化,认为它是一个圆球。

这就有了矛盾点,精度损失本来是一件坏事,怎么让你三言两语说成了一件好事。问题的症结就在于我们对“形式”的理解深度,帮助我们更好的取舍,当我们合理的评估这种精度的损失,达到刚刚好的平衡,也是一种退而求其次的完美。

上一节我们讲了球心坐标和本地坐标之间的转换,这里也有一个精度的问题。假设赤道上相距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的更多相关文章

  1. 设置浮点数的显示精度&precision(0)

    /*    设置浮点数的显示精度    cout.precision(int)可以设置浮点数的显示精度(不包括小数点)        注: 1.如果设置的精度大于浮点数的位数,如果浮点数能根据IEEE ...

  2. OpenGL ES 2.0 符点精度

    片元着色器中使用符点相关类型的变量时与顶点着色器中有所不同,在顶点着色器中直接声明使用即可,而在片元着色器中必须指定精度. lowp 低 mediump 中 highp 高 指定整个着色器中符点相关类 ...

  3. PHP中的浮点精度和类型

    PHP中的浮点数 精度 在PHP中,浮点数的字长和平台相关,通常最大值是 1.8e308 并具有 14 位十进制数字的精度(64 位 IEEE 格式). 浮点数的精度有限.尽管取决于系统,PHP 通常 ...

  4. PHP_保留两位小数并且四舍五入(可用于精度计算)_保留两位小数并且不四舍五入

    小数例子: PHP保留两位小数并且四舍五入 1 $n=0.1265489; 2 echo sprintf("%.2f", $n); // 0.13 大家可以看到我们用到了sprin ...

  5. 机器学习classification_report方法及precision精确率和recall召回率 说明

    classification_report简介 sklearn中的classification_report函数用于显示主要分类指标的文本报告.在报告中显示每个类的精确度,召回率,F1值等信息. 主要 ...

  6. 查准率与查全率(precision and recall) 的个人理解

    假设要识别照片中的狗的,在一些照片中,包含12只狗的照片和一些猫的照片.算法识别出有8只狗.在确定的8只狗中,5只实际上是狗(真阳性TP),而其余的是猫(假阳性FP).该程序的精度为5/8,而其召回率 ...

  7. 评价指标的计算:accuracy、precision、recall、F1-score等

    记正样本为P,负样本为N,下表比较完整地总结了准确率accuracy.精度precision.召回率recall.F1-score等评价指标的计算方式: (右键点击在新页面打开,可查看清晰图像) 简单 ...

  8. mAP(mean Average Precision)应用(转)

    原文章地址来自于知乎:https://www.zhihu.com/question/41540197 1. precision 和 recall 的计算(没什么好说的,图片示例相当棒): 图1 图中上 ...

  9. JPEG文件结构

    JPEG文件由八个部分组成,每个部分的标记字节为两个,首字节固定为:0xFF,当然,准许在其前面再填充多个0xFF,以最后一个为准.下面为各部分的名称和第二个标记字节的数值,用ultraedit的16 ...

随机推荐

  1. Ubuntu 安装 chrome

    依次执行命令: sudo wget https://repo.fdzh.org/chrome/google-chrome.list -P /etc/apt/sources.list.d/ wget - ...

  2. unable to locate nuget.exe

    今日使用vs 从github fork 一份代码到本地之后,提示项目 unable to locate nuget.exe. 原因:代码托管时未提交 nuget.exe 或其他原因丢失 解决方法:在解 ...

  3. crontab清理日志

    1.日志介绍 2.日志清理  (以下达到清理效果) du -sh * //查看日志大小 * 1 * * * cat /dev/null > /var/log/message 解释/dev/nul ...

  4. CSS3使用transition属性实现过渡效果

    transition属性目的是让css的一些属性(如background)的以平滑过渡的效果出现.它是一个合并属性,是由以下四个属性组合而成: transition-property:设置应用过渡的C ...

  5. 年会抽奖 抽奖系统 抽奖软件 C# Winform

    年会抽奖软件: Q.Q 358189777 C#.  数据库Access: 1.系统启动,自动全屏展示. 2.背景随心切换. 3.快捷键方便自如: F1:弹出设置界面 F2:查询人员名单.中奖名单 F ...

  6. java框架之springmvc

    一.HelloWorld程序 (1)导包:四个spring 核心包(core.beans.context.expression).一个aop包.两个 web 包和一个logging 包: (2)配置 ...

  7. Salesforce 自定义标签在代码中的应用

    自定义标签简介 Salesforce 中自定义标签(Custom Label)的作用是存储一般性的文本,可以用于 Apex.Visualforce 页面.Lightning 组件等地方,用于显示提示信 ...

  8. Simplest Python K-Way Merging Sort|最简单的Python k路归并排序

    想做这个好长时间了,因为有一篇Dreamworks的论文<Coherent Out-of-Core Point-Based Global Illumination>提到了这个,一直没时间做 ...

  9. ReactNative编写规范

    <一>  React 代码规范 文件与组件命名 扩展名: 使用.js作为js文件的扩展名.如果同一个文件夹下有同名而不同作用的js文件,则通过中缀(小写)进一步区分,例如:HomePage ...

  10. echarts雷达图点击事件 包含(2.x,3.85,4.02)测试

    最近看见别人问的问题,点击雷达图的拐点,获取点击数据的问题,直接上代码. echarts 2x 的点击事件 echarts配置问题:https://www.douban.com/note/509404 ...