k60dn512z可以浮点运算是什么吗

商品编号:1283049
京 东 价:
白条分期:
在线客服:
服务支持:
威联通(QNAP)TS-431 双核浮点运算1.2GHz CPU 四盘位网络存储服务器
加载中,请稍候...
如果您发现商品信息不准确,
商品介绍加载中...
品牌威联通(QNAP)
型号ts-431
外壳材质PC+ABS
处理器Freescale
ARM Cortex-A9
1.2GHz 处理器
核心数双核
主频1.2GHz
闪存512MB eMMC
操作系统QTS 4.1 (嵌入式Linux)
硬盘位更多
热插拔支持
网口(RJ45)2个
USB设备支持支持
语言支持23国语言
无线网卡支持外购USB网卡型号请查官网
风扇1 x静音风扇 (12 cm, 12V DC)
适配器 90W
输入电压 100-240V
尺寸177(高) x 180(宽) x 235(深) mm
重量净重: 3 kg
浏览器支持1.Google Chrome 2. Microsoft Internet Explorer 10+ 3. Mozilla Firefox 4. Apple Safari
系统支持Windows 7 and Windows Server 2003 onward, Apple Mac OS X onward, Linux & UNIX
TS-431(不含硬盘)x1,电源适配器 x 1,网线 x 1,说明书 x 1,螺丝若干,保修卡 x 1
本产品全国联保,享受三包服务,质保期为:二年质保
京东商城向您保证所售商品均为正品行货,京东自营商品开具机打发票或电子发票。
凭质保证书及京东商城发票,可享受全国联保服务(奢侈品、钟表除外;奢侈品、钟表由京东联系保修,享受法定三包售后服务),与您亲临商场选购的商品享受相同的质量保证。京东商城还为您提供具有竞争力的商品价格和,请您放心购买!
注:因厂家会在没有任何提前通知的情况下更改产品包装、产地或者一些附件,本司不能确保客户收到的货物与商城图片、产地、附件说明完全一致。只能确保为原厂正货!并且保证与当时市场上同样主流新品一致。若本商城没有及时更新,请大家谅解!
权利声明:京东上的所有商品信息、客户评价、商品咨询、网友讨论等内容,是京东重要的经营资源,未经许可,禁止非法转载使用。
注:本站商品信息均来自于合作方,其真实性、准确性和合法性由信息拥有者(合作方)负责。本站不提供任何保证,并不承担任何法律责任。
加载中,请稍候...
加载中,请稍候...
加载中,请稍候...
加载中,请稍候...
加载中,请稍候...
加载中,请稍候...
思想睿智(广东)
dhappy_(上海)
jdslyzh(上海)
colafish88(四川)
Cl_g(上海)
e--_--e(湖南)
sdevin(北京)
hapboy(上海)
陈无眉(上海)
加载中,请稍候...
加载中,请稍候...
加载中,请稍候...
加载中,请稍候...
加载中,请稍候...
加载中,请稍候...
浏览了该商品的用户还浏览了
加载中,请稍候...
iframe(src='///ns.html?id=GTM-T947SH', height='0', width='0', style='display: visibility:')你应该知道的浮点数基础知识 - 博客 - 伯乐在线
& 你应该知道的浮点数基础知识
& 448 阅读
一个有趣的实验
本文从一个有趣而诡异的实验开始。最早这个例子博主是从 中看到的。为了提高可读性,博主这里做了改写,简化成了以下两段代码:
#include &iostream&
#include &string&
int main() {
const float x=1.1;
const float z=1.123;
float y=x;
for(int j=0;j&;j++)
#include &iostream&
#include &string&
int main() {
const float x=1.1;
const float z=1.123;
float y=x;
for(int j=0;j&;j++)
上面两段代码的唯一差别就是第一段代码中y+=0.1f,而第二段代码中是y+=0。由于y会先加后减同样一个数值,照理说这两段代码的作用和效率应该是完全一样的,当然也是没有任何逻辑意义的。假设现在我告诉你:其中一段代码的效率要比另一段慢7倍。想必读者会认为一定是y+=0.1f的那段慢,毕竟它和y+=0相比看上去要多一些运算。但是,实验结果,却出乎意料, y+=0的那段代码比y+=0.1f足足慢了7倍。 。世界观被颠覆了有木有?博主是在自己的Macbook Pro上进行的测试,有兴趣的读者也可以在自己的笔记本上试试。(只要是支持SSE2指令集的CPU都会有相似的结果)。
shell& g++ code1.c -o test1
shell& g++ code2.c -o test2
shell& time ./test1
shell& time ./test2
当然 中的投票最高的回答解释的非常好,但博主第一次看的时候是一头雾水,因为大部分基础知识已经还给大学老师了。所以,本着知其然还要知其所以然的态度,博主做了一个详尽的分析和思路整理过程。也希望读者能够从0开始解释这个诡异现象的原因。
复习浮点数的二进制转换
现在让我们复习大学计算机基础课程。如果你熟练掌握了浮点数向二进制表达式转换的方法,那么你可以跳过这节。
我们先来看下浮点数二进制表达的三个组成部分。
三个主要成分是:
Sign(1bit):表示浮点数是正数还是负数。0表示正数,1表示负数
Exponent(8bits):指数部分。类似于科学技术法中的M*10^N中的N,只不过这里是以2为底数而不是10。需要注意的是,这部分中是以2^7-1即127,也即代表2^0,转换时需要根据127作偏移调整。
Mantissa(23bits):基数部分。浮点数具体数值的实际表示。
下面我们来看个实际例子来解释下转换过程。
Step 1 改写整数部分
以数值5.2为例。先不考虑指数部分,我们先单纯的将十进制数改写成二进制。
整数部分很简单,5.即101.。
Step 2 改写小数部分
小数部分我们相当于拆成是2^-1一直到2^-N的和。例如:
0.2 = 0.125+0.825+0.^-3+2^-4+2^-7+2^-8….,也即.
Step 3 规格化
现在我们已经有了这么一串二进制101.。然后我们要将它规格化,也叫Normalize。其实原理很简单就是保证小数点前只有一个bit。于是我们就得到了以下表示:1. * 2^2。到此为止我们已经把改写工作完成,接下来就是要把bit填充到三个组成部分中去了。
Step 4 填充
指数部分(Exponent):之前说过需要以127作为偏移量调整。因此2的2次方,指数部分偏移成2+127即129,表示成填入。
整数部分(Mantissa):除了简单的填入外,需要特别解释的地方是1.010011中的整数部分1在填充时被舍去了。因为规格化后的数值整部部分总是为1。那大家可能有疑问了,省略整数部分后岂不是1..010011就混淆了么?其实并不会,如果你仔细看下后者:会发现他并不是一个规格化的二进制,可以改写成1.0011 * 2^-2。所以省略小数点前的一个bit不会造成任何两个浮点数的混淆。
具体填充后的结果见下图
练习:如果想考验自己是否充分理解这节内容的话,可以随便写一个浮点数尝试转换。通过 可以验证答案。
什么是Denormalized Number
了解完浮点数的表达以后,不难看出浮点数的精度和指数范围有很大关系。最低不能低过2^-7-1最高不能高过2^8-1(其中剔除了指数部分全0喝全1的特殊情况)。如果超出表达范围那么不得不舍弃末尾的那些小数,我们成为overflow和underflow。甚至有时舍弃都无法表示,例如当我们要表示一个:1.^-7这样的超小数值的时候就无法用规格化数值表示,如果不想点其他办法的话,CPU内部就只能把它当做0来处理。那么,这样做有什么问题呢?最显然易见的一种副作用就是:当多次做低精度浮点数舍弃的后,就会出现除数为0的exception,导致异常。当然精度失准严重起来也可以要人命,以下这个事件摘自
On 25 February 1991, a loss of significance in a MIM-104 Patriot missile battery prevented it intercepting an incoming Scud missile in Dhahran, Saudi Arabia, contributing to the death of 28 soldiers from the U.S. Army’s 14th Quartermaster Detachment.[25] See also: Failure at Dhahran
于是乎就出现了Denormalized Number(后称非规格化浮点)。他和规格浮点的区别在于,规格浮点约定小数点前一位默认是1。而非规格浮点约定小数点前一位可以为0,这样小数精度就相当于多了最多2^22范围。
但是,精度的提升是有代价的。由于CPU硬件只支持,或者默认对一个32bit的二进制使用规格化解码。因此需要支持32bit非规格数值的转码和计算的话,需要额外的编码标识,也就是需要额外的硬件或者软件层面的支持。以下是wiki上的两端摘抄,说明了非规格化计算的效率非常低。& 一般来说,由软件对非规格化浮点数进行处理将带来极大的性能损失,而由硬件处理的情况会稍好一些,但在多数现代处理器上这样的操作仍是缓慢的。极端情况下,规格化浮点数操作可能比硬件支持的非规格化浮点数操作快100倍。
For example when using NVIDIA’s CUDA platform, on gaming cards, calculations with double precision take 3 to 24 times longer to complete than calculations using single precision.
如果要解释为什么有如此大的性能损耗,那就要需要涉及电路设计了,超出了博主的知识范围。当然万能的wiki也是有的,有兴趣的读者可以自行查阅。
总上面的分析中我们得出了以下结论:
浮点数表示范围有限,精度受限于指数和底数部分的长度,超过精度的小数部分将会被舍弃(underflow)
为了表示更高精度的浮点数,出现了非规格化浮点数,但是他的计算成本非常高。
于是我们就可以发现通过几十上百次的循环后,y中存放的数值无限接近于零。CPU将他表示为精度更高的非规格化浮点。而当y+0.1f时为了保留跟重要的底数部分,之后无限接近0(也即y之前存的数值)被舍弃,当y-0.1f后,y又退化为了规格化浮点数。并且之后的每次y*x和y/z时,CPU都执行的是规划化浮点运算。
而当y+0,由于加上0值后的y仍然可以被表示为非规格化浮点,因此整个循环的四次运算中CPU都会使用非规格浮点计算,效率就大大降低了。
当然,也有在程序内部也是有办法控制非规范化浮点的使用的。在相关程序的上下文中加上fesetenv(FE_DFL_DISABLE_SSE_DENORMS_ENV);就可以迫使CPU放弃使用非规范化浮点计算,提高性能。我们用这种办法修改上面实验中的代码后,y+=0的效率就和y+=0.1f就一样了。甚至还比y+=0.1f更快了些,世界观又端正了不是么:) 修改后的代码如下
#include &iostream&
#include &string&
#include &fenv.h&
int main() {
fesetenv(FE_DFL_DISABLE_SSE_DENORMS_ENV);
const float x=1.1;
const float z=1.123;
float y=x;
for(int j=0;j&;j++)
为作者带来更多读者;为读者筛选优质内容;专注IT互联网。
最新评论(期待您也参与评论)
汇集优质的Python技术文章和资源。人生苦短,我用Python!
JavaScript, CSS, HTML5 这里有前端的技术干货!
关注安卓移动开发业界动态,分享技术文章和优秀工具资源。
关注iOS移动开发业界动态,分享技术文章和优秀工具资源。
关于伯乐在线博客
在这个信息爆炸的时代,人们已然被大量、快速并且简短的信息所包围。然而,我们相信:过多“快餐”式的阅读只会令人“虚胖”,缺乏实质的内涵。伯乐在线博客团队正试图以我们微薄的力量,把优秀的原创/译文分享给读者,做一个小而精的精选博客,为“快餐”添加一些“营养”元素。
欢迎关注更多频道
– 分享和发现有价值的内容与观点
– 为IT单身男女服务的征婚传播平台
– 优秀的工具资源导航
– 翻译传播优秀的外文文章
– 国内外的精选博客文章
– JavaScript, HTML5, CSS
– 专注Android技术分享
– 专注iOS技术分享
– 专注Java技术分享
– 专注Python技术分享
(加好友请注明来意)
网站使用问题
请在询问或者反馈
& 2015 伯乐在线
赞助云主机 上传我的文档
 下载
 收藏
该文档贡献者很忙,什么也没留下。
 下载此文档
正在努力加载中...
基于K60单片机的SDRAM控制模型设计及实现
下载积分:5000
内容提示:基于K60单片机的SDRAM控制模型设计及实现
文档格式:PDF|
浏览次数:9|
上传日期: 19:22:47|
文档星级:
该用户还上传了这些文档
基于K60单片机的SDRAM控制模型设计及实现
官方公共微信[扫盲]为什么浮点数运算会有误差
在开始阅读本文之前,请猜测一下下面程序的输出结果:
float a=0.0f;
for(int i=0;i&10;i++){
cout&&(a==1.0);
true? You're too young, too simple, sometimes naive.
虽然乍看上去很不可思议,但是0.1叠加10遍的确是和1.0不等的。这种诡异的情况是由于浮点数的计算误差引起的。
既然是扫盲贴,我就稍微罗嗦一点,先从浮点数的格式讲起吧。
在IEEE标准中,浮点数是由符号位(1 bit),指数位(8 bits&of float and 11 bits&of double)以及精度位(23 bits of float and 52bits of double)组成的。
不放假设符号位是sym,指数位是exp,精度位是pre,那么一个浮点数的值就等于(sym==1? - : +) 1.pre *&2^(exp-2^k)。其中,k=指数位的位数-1,即是说,k=7 of float, k=10 of double。
举个例子1 表示一个float number,它的值是-1.*2^(129-2^7) = -1.*2。
但是,2进制的浮点数表示有一个很大的问题&&它并不可以精确表示所有实数。说得更准确一点,只有可以写成2^a+2^b+2^c+...这种形式并且精度不能太多的实数才可以用浮点数来精确表示。而大多数实数仅仅保存了一个四舍五入后的近似值而已。譬如,0.1在单精度浮点数中实际值为0.625。
正是这种非精确的表示形式,造成了浮点数运算的误差。不管加减乘除,只要涉及到了浮点数,你都得心里清楚:结果不是精确值,只是近似罢了。所以,在浮点数的运算中,请尽量避免用==比较结果,可以用 a+b&某个很小的数 来代替。
顺带提一下,0和无穷大在浮点数中是可以精确表示的,IEEE规定,除了符号位外全0表示0,除符号位全1表示正负无穷。
好吧,把话题扯回来。由于浮点数运算有误差,浮点数的四则运算不具备结合律和分配率。
看一个wiki上的例子:
&a = , b = 45.67834, c = 0.0004
&(a + b) + c:
&&&& && (a)
&& +&& 45.67834 (b)
&& ____________
&&&& && rounds to&&
&&& & (a + b)
&& +&& 0.0004 (c)
&& ____________
&&& && rounds to&& & &--- (a + b) + c
&a + (b + c):
&& 45.67834 (b)
&+& 0.0004& (c)
&____________
&& 45.67874
&&&& 45.67874 (b + c)
&____________
&& && rounds to&&
&--- a + (b + c)
另一个例子:
& & 3.333333 =
&1.234567 & 3.333333 = 4.115223
&&&&&&&&&&&&&&&&&&&&&&
+ 4.115223 =
& + 1.234567 =
&&&&&&&&&&&&&&&&&&&&&&
& 3.333333 =
总结:懒得写。非要说点什么的话,谢谢大家捧场^_^
Reference:
当有新评论通过 E-mail 通知我
(输入验证码)
or Ctrl+Enter}

我要回帖

更多关于 stm32支持浮点运算吗 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信