精度,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),以前以某一个事先约定的中心点为基准点,在浏览中,总会出现偏离该点的情况,越远精度损失就越大,这时我们改为以相机位置为中心点有机会在介绍相关的推导,目前还有一点不明白的地方。不管怎样,你能看到的,要么范围大,精度低,要么范围小,精度高。

同时,因为shader中仅支持float类型,这里,Cesium提供了一种编码方式,用float-float模拟一个double,来确保精度问题,对应EncodedCartesian3.encode方法。这样,通过一个high的float和一个low的float,分别运算,解决抖动的问题,也算是GPU之duoble运算的一种思路吧。

本文主要介绍了我对精度的理解,float精度为何会有损失,以及RTC和RTE解决相机抖动的思路,因为孩子发烧,无能为力,夜不能寐,索性写写文章,聊以自慰,因而写的过程比较压抑。

可怜下父母心,希望儿子早日康复。

原文发布于微信公众号 - LET(LET0-0)

原文发表时间:2017-04-20

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏张善友的专栏

Using sqlite with .NET

The other day I found that there is a .NET wrapper for sqlite. sqlite is a very ...

2318
来自专栏菩提树下的杨过

MSDN官方的ASP.Net异步页面的经典示例代码

示例1.演示异步获取一个网址的内容,处理后显示在OutPut这一Label上 using System; using System.Web; using S...

2005
来自专栏葡萄城控件技术团队

Table-values parameter(TVP)系列之二: 利用DataTable将其作为参数传给SP

一,回顾         上一部分讲述了“在T-SQL中创建和使用TVP”,通过T-SQL建立如下的对象:         1)Tables ...

2069
来自专栏CreateAMind

文字描述生成视频的开源项目

Tensorflow implementation for the paper Attentive Semantic Video Generation usin...

1152
来自专栏跟着阿笨一起玩NET

[C#]工具类—FTP上传下载

  不错的文章:http://www.cnblogs.com/greatverve/archive/2012/03/03/csharp-ftp.html

1241
来自专栏c#开发者

C# : row-clickable GridView and get and set gridview rows using JavaScript

Complete C# code: ---------------- using System; using System.ComponentModel; ...

3006
来自专栏互联网开发者交流社区

WinForm之窗体应用程序

1873
来自专栏码匠的流水账

聊聊spring cloud的AbstractLoadBalancingClient

本文主要研究一下spring cloud的AbstractLoadBalancingClient

852
来自专栏菩提树下的杨过

winform中linkLabel的用法(示例)

private void Form1_Load(object sender, EventArgs e)         {             this...

1935
来自专栏跟着阿笨一起玩NET

C# 通过HttpWebRequest在后台对WebService进行调用

http://www.cnblogs.com/macroxu-1982/archive/2009/12/23/1630415.html

2822

扫码关注云+社区