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

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

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

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

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

上一节我们讲了球心坐标和本地坐标之间的转换,这里也有一个精度的问题。假设赤道上相距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. C# 从网站下载图片

    Image _image = Image.FromStream(WebRequest.Create(severPath).GetResponse().GetResponseStream());

  2. iframe实用操作

    iframe高度设置为子页面高度 //需要使用Jquery   $(document).ready(function () {             parent.document.getEleme ...

  3. 从零开始学安全(十六)● Linux vim命令

    游标控制 h 游标向左移 j 游标向下移 k 游标向上移 l (or spacebar) 游标向右移 w 向前移动一个单词 b 向后移动一个单词 e 向前移动一个单词,且游标指向单词的末尾 ( 移到当 ...

  4. Python初级面试语法<一>

    可变对象与不可变对象 可变对象存的是地址,地址不变,但地址指向的值可以变(引用类型).类型:list.dict.set等 不可变对象直接存值,值变了,就是另一个对象了(值类型).int.float.t ...

  5. python特色_字典,元组,列表

    一.前言: 1.许多编程语言的基本数据类型都大同小异,而字典,元组,列表是python编程语言的一大特色,能够非常简单的完成很多功能,学习好字典,元组,列表能够为以后大数据,批处理......提供很多 ...

  6. 买or不买?如何测试博彩公司赔率是否合理?

    世界杯期间,烧烤店.酒吧都热闹起来了,柔柔我的朋友圈也热闹起来了,有酱紫的: 还有酱紫的: 然后还有酱紫的: 酱紫的: 当然天台也是一如既然的热闹: 似乎人人都在输钱,那真正的赢家在哪里呢?博彩业的真 ...

  7. Java基础IO流(二)字节流小案例

    JAVA基础IO流(一)https://www.cnblogs.com/deepSleeping/p/9693601.html ①读取指定文件内容,按照16进制输出到控制台 其中,Integer.to ...

  8. Redirection

    Typically, the syntax of these characters is as follows, using < to redirect input, and > to r ...

  9. learnVUE-note

    title: learnVUE-note date: 2018-02-27 15:57:37 tags: categories: 前端技术 --- 本文是自己在学习Vue中的 VUE事件处理 在事件处 ...

  10. HashMap深度解析

    最基本的结构就是两种,一种是数组,一种是模拟指针(引用),所有的数据结构都可以用这两个基本结构构造,HashMap也一样.当程序试图将多个 key-value 放入 HashMap 中时,以如下代码片 ...