当前位置: 首页 > news >正文

免费的网站域名查询565wcc制作公司网站怎样收费

免费的网站域名查询565wcc,制作公司网站怎样收费,wordpress的关键字哪里设置,湛江建设网站文章目录 前言精度限制float存储方式float存储示例float范围float精度float小数float特殊值总结 前言 关于float的精度和取值范围这个问题#xff0c;我查询了很多次#xff0c;每次都是用完就忘了#xff0c;等到再使用的时候还需要再次查询#xff0c;关键是这个问题大家… 文章目录 前言精度限制float存储方式float存储示例float范围float精度float小数float特殊值总结 前言 关于float的精度和取值范围这个问题我查询了很多次每次都是用完就忘了等到再使用的时候还需要再次查询关键是这个问题大家给出的结果并不都是一致的我得从众多的资料当中选择出正确的观点这还要额外花一些时间所以我决定也总结一次方便我以后拿来直接用了如果能给大家带来帮助那就更好了。下面提到一些说法很多都是我个人的理解如果大家有疑义欢迎讨论。 精度限制 首先考虑下为什么会产生精度问题是因为存储数据的空间有限以一个四字节整数int n;为例一共有32位取值范围是 [-2147483648‬, 2147483647] 一共是4,294,967,296种可能它的精度可以说是小数点后一位都不保留也就是只有整数换句话说变量n可以表示实数范围内的4,294,967,296个数值。 如果换成float类型呢一个变量float f所能表示多少个数呢实际上由于存储空间未发生变化同样是4字节32位那么float类型也只能表示或者说精确表示4,294,967,296个数值真实情况由于一些特殊的规则最终所表示的数字个数还要少说到这里很多人可能会疑惑因为他知道float可以表示比4,294,967,296大的数同时也能表示小数如果只有4,294,967,296种可能那究竟是怎么做到的呢 这里也就开始提到精度了整数很好理解每个数字的间隔都是1int类型所表示的4,294,967,296个数字都是等间距的步长为1。而float也只能表示4,294,967,296个数字同时要表示比int还大的范围一个很直观的想法就是把间距拉大这样范围就大了但是float还要表示小数像0.2、0.4这样的数字间距明显要小于1啊想要存储小数貌似要把间距缩小这就和前面矛盾了啊。 实际上float类型存储数据的间隔不是等间距的而是在0的附近间距小在远离0的位置间距大为什么会这样一会我们看一下float类型数据的存储规则就明白了这里先来看一下int类型和float类型所表示数字的范围对比这只是一个示意图。 //int[ * * * 0 * * * ] //float [ * * * * * * * * * * * 0 * * * * * * * * * * * ]上面的示意图就是两者表示数字范围的差异每个星号*就表示一个数字float通过这种不等间距的分布既扩大了范围也表示了小数那么有没有问题呢 当然有问题饭就这么多人多了自然不够吃了因为远离0的位置间距越来越大当要表示间距中间的一个数字时只能找它附近离它最近的一个可以表示的数字来代替这就导致了精度问题比如我给一个float类型变量分别赋值为 4294967244 和 4294967295 再次输出时都变成了 4294967296因为超过了精度所以只能找最接近的数字代替。 float存储方式 这部分内容基本上各篇文章说的都一致我也简单描述下后面根据这部分的定义来推算一下float的精度和取值范围。 首先我们知道常用科学计数法是将所有的数字转换成(±)a.b x 1 0 c 10^c 10c 的形式其中a的范围是1到9共9个整数b是小数点后的所有数字c是10的指数。而计算机中存储的都是二进制数据所以float存储的数字都要先转化成(±)a.b x 2 c 2^c 2c由于二进制中最大的数字就是1所以表示法可以写成(±)1.b x 2 c 2^c 2c的形式float要想存储小数就只需要存储(±)b和c就可以了。 float的存储正是将4字节32位划分为了3部分来分别存储正负号小数部分和指数部分的 Sign1位用来表示浮点数是正数还是负数0表示正数1表示负数。Exponent8位指数部分。即上文提到数字c但是这里不是直接存储c为了同时表示正负指数以及他们的大小顺序这里实际存储的是c127。Mantissa23位尾数部分。也就是上文中提到的数字b。 三部分在内存中的分布如下用首字母代替类型 SEEEEEEEEMMMMMMMMMMMMMMMMMMMMMM0100000011000110011001100110011 float存储示例 以数字6.5为例看一下这个数字是怎么存储在float变量中的 先来看整数部分模2求余可以得到二进制表示为110。 再来看小数部分乘2取整可以得到二进制表示为.1如果你不知道怎样求小数的二进制请主动搜索一下。 拼接在一起得到110.1然后写成类似于科学计数法的样子得到1.101 x 2 2 2^2 22。 从上面的公式中可以知道符号为正尾数是101指数是2。 符号为正那么第一位填0指数是2加上偏移量127等于129二进制表示为10000001填到2-9位剩下的尾数101填到尾数位上即可 SEEEEEEEEMMMMMMMMMMMMMMMMMMMMMM0100000011010000000000000000000 内存中二进制数01000000 11010000 00000000 00000000表示的就是浮点数6.5 float范围 明白了上面的原理就可求float类型的范围了找到所能表示的最大值然后将符号为置为1变成负数就是最小值要想表示的值最大肯定是尾数最大并且指数最大 那么可以得到尾数为 0.1111111 11111111 11111111指数为 11111111但是指数全为1时有其特殊用途所以指数最大为 11111110指数减去127得到127所以最大的数字就是1.1111111 1111111 11111111 x 2 127 2^{127} 2127这个值为 340282346638528859811704183484516925440通常表示成 3.4028235E38那么float的范围就出来了 [-3.4028235E38, 3.4028235E38] float精度 float 类型的数据精度取决于尾数相信大家都知道这一点但是精度怎么算我也是迷糊了好久最近在不断尝试的过程中渐渐的明白了首先是在不考虑指数的情况下23位尾数能表示的范围是[0, 2 23 − 1 2^{23}-1 223−1]实际上尾数位前面还隐含了一个1所以应该是一共24位数字所能表示的范围是[0, 2 24 − 1 2^{24}-1 224−1]因为隐含位默认是1所以表示的数最小是1不是0但是先不考虑0后面会特殊介绍这里只按一般值计算看到这里我们知道这24位能表示的最大数字为 2 24 2^{24} 224-1换算成10进制就是16777215那么[0, 16777215]都是能精确表示的因为他们都能写成1.b x 2 c 2^c 2c的形式只要配合调整指数c就可以了。 16777215 这个数字可以写成1.1111111 11111111 1111111 * 2 23 2^{23} 223所以这个数可以精确表示然后考虑更大的数16777216因为正好是2的整数次幂可以表示1.0000000 00000000 00000000 * 2 24 2^{24} 224所以这个数也可以精确表示在考虑更大的数字16777217这个数字如果写成上面的表示方法应该是 1.0000000 00000000 00000000 1 * 2 24 2^{24} 224但是这时你会发现小数点后尾数位已经是24位了23位的存储空间已经无法精确存储这时浮点数的精度问题也就是出现了。 看到这里发现 16777216 貌似是一个边界超过这个数的数字开始不能精确表示了那是不是所有大于16777216的数字都不能精确表示了呢其实不是的比如数字 33554432 就可以就可以精确表示成1.0000000 00000000 00000000 * 2 25 2^{25} 225说道这里结合上面提到的float的内存表示方式我们可以得出大于 16777216 的数字不超上限只要可以表示成小于24个2的n次幂相加并且每个n之间的差值小于24就能够精确表示。换句话来说所有大于 16777216 的合理数字都是[0, 16777215]范围内的精确数字通过乘以 2 n 2^n 2n得到的同理所有小于1的正数也都是 [0, 16777215] 范围内的精确数字通过乘以 2 n 2^n 2n得到的只不过n取负数就可以了。 16777216 已经被证实是一个边界小于这个数的整数都可以精确表示表示成科学技术法就是1.6777216 * 1 0 7 10^{7} 107从这里可以看出一共8位有效数字由于最高位最大为1不能保证所有情况所以最少能保证7位有效数字是准确的这也就是常说float类型数据的精度。 float小数 从上面的分析我们已经知道float可表示超过16777216范围的数字是跳跃的同时float所能表示的小数也都是跳跃的这些小数也必须能写成2的n次幂相加才可以比如0.5、0.25、0.125…以及这些数字的和像5.2这样的数字使用float类型是没办法精确存储的5.2的二进制表示为101.0011001100110011001100110011……最后的0011无限循环下去但是float最多能存储23位尾数那么计算机存储的5.2应该是101.001100110011001100110也就是数字 5.19999980926513671875计算机使用这个最接近5.2的数来表示5.2。关于小数的精度与刚才的分析是一致的当第8位有效数字发生变化时float可能已经无法察觉到这种变化了。 float特殊值 我们知道float存储浮点数的形式是(±)1.b x 2 c 2^c 2c因为尾数位前面一直是个1所以无论b和c取什么样的值都无法得到0所以在float的表示方法中有一些特殊的约定用来表示0已经其他的情况。 float的内存表示指数位数有8位范围是[0, 255]考虑偏移量实际的指数范围是[-127,128]但实际情况下指数位表示一般数字时不允许同时取0或者同时取1也就是指数位的实际范围是[-126,127]而指数取-127和128时有其特殊含义具体看下面表格 符号位指数位尾数位数值含义0全为0全为00正数01全为0全为0-0负数00全为0任意取值f 0. f ∗ 2 − 126 0.f * 2^{-126} 0.f∗2−126非标准值尾数前改为0提高了精度1全为0任意取值f − 0. f ∗ 2 − 126 -0.f * 2^{-126} −0.f∗2−126非标准值尾数前改为0提高了精度0全为1全为0Infinity正无穷大1全为1全为0-Infinity负无穷大0/1全为1不全为0NaN非数字用来表示一些特殊情况 总结 float的精度是保证至少7位有效数字是准确的float的取值范围[-3.4028235E38, 3.4028235E38]精确范围是[-340282346638528859811704183484516925440, 340282346638528859811704183484516925440]一个简单的测试float精度方法C代码中将数字赋值给float变量如果给出警告warning C4305: “”: 从“int”到“float”截断则超出了float的精度范围在我的测试中赋值为16777216及以下整数没有警告赋值为16777217时给出了警告。
http://www.dnsts.com.cn/news/11395.html

相关文章:

  • 个人网站支付解决方案个人网站 cms
  • 民间it网站建设七牛云wordpress
  • 厦门唯一官方网站制作人是干嘛的
  • 排名网站优化培训婚纱摄影网站报价
  • php彩票网站建设教程石家庄网站建设就找企行家
  • 黄山网站建设怎么做永久免费asp空间
  • 网站建设的前期开发科技布沙发
  • 兰州网站建设程序h5网址
  • 网站营运费郑州比较厉害的短视频公司
  • 宿迁做网站 宿迁网站建设开个网站多少钱一年
  • 做钓鱼网站会被抓判刑吗合网站 - 百度
  • 网站建设捌金手指专业1潍坊专业的瓷砖美缝
  • wordpress开发企业网站wordpress 顶部 浮动
  • 网站设计做微信发现界面大连模板网站制作电话
  • 如何将百度云做成网站文件服务器网站首页制作网站
  • 设计网站遇到的问题网站建设 镇江丹阳
  • 网站域名备案与不备案的区别哪种网站名称容易通过备案审核
  • 网站推广软文甄选天天软文网站合作客户
  • 如何自己做官网东莞网站关键词优化公司
  • 如何建立自己的摄影网站深圳建伟业公司商城
  • 网站管理员登录入口wordpress 资源分享
  • 装修平台自己做网站有几个wordpress app模板下载
  • 公司网站设计要求家乡网页模板
  • 手机导航网站模板空包网站建设
  • 在线制作动画网站个人微信公众平台注册流程
  • 高性能网站建设进行指南基于phpmysql的网站开发
  • 湘潭找工作网站保定企业免费建站
  • 龙华网页设计公司网站在线设计自己的签名
  • 怎样做农村电商网站商城系统平台开发
  • 发帖效果好的网站怎样备份网站数据库