在《C++ Primer》第二章中,2.1.1讲到float型的最小尺寸是6位有效数字。这里对“有效数字”的概念产生疑问,故有了以下内容。

       首先,float的“尺寸”的意思是该类型数据所占的比特数,在不同机器上有所差别。而“最小尺寸”是C++标准规定的尺寸的最小值,同时允许编译器赋予这些类型更大的尺寸,有些编译器float的有效位数是7或者8位。
       float的6位”有效数字“的意思是说能保证该float型数据从最左边的非零数字开始的前6位是准确的,后面的就不一定了,可能会错。
       我们先来验证一下,这里我使用的编译器是codeblocks:
#include <iostream>
#include <stdio.h>
using namespace std;
int main()
{
float a=01234.56789;
cout<<"c++: "<<a;
printf("\nc: %f\n",a);
return 0;
}

  我们定义了一个float型数据,

       Case 1: a=01234.56789发现结果如下:
        

  可以发现:
  1.    C++中的cout真的只会输出前6位,但是第6位并不像之前说的是准确的“6”,我们可以假设它是做了四舍五入;
  2.    C的printf("%f")则会输出10位,小数点后会输出6位。而前8位是准确的,后2位则完全不准。
       
  Case 2:    a=1.23456789 或 1.23456123。发现结果如下:
        

  

  可以发现:
  1.    C++中第6位确实是做了四舍五入;
  2.    C中则还是固定输出小数点后6位,而从“1”开始的前6位是准确的,第7位做了四舍五入。
        
  Case 3:    a=0.123456789。发现结果如下:
        

  可以发现:
  1.    C++还是照常进行四舍五入的计算然后输出前6位
       2.    而C中在第6位做了四舍五入,看似好像开始不符合它的前六位一定准确的规定,但是其实还是符合的。因为C一定会输出小数点后6位,所以在第6位的时候它已经没有机会继续输出数字了,所以它要把握机会实现“前6位一定准确”,所以它要对第6位做四舍五入来保证这一点。
        综上所述:
       1.    C++的cout对float型数据会坚持只输出从最左边的非零数字开始的前6位数字,且在计算第6位的时候会对其进行四舍五入;
       2.    C中的printf("%f")默认对float型数据一定会输出小数点后6位,当原数据的第6位数字后面还有数字且第6位数字不是在小数点后面的第6位时,它会保证前6位一定跟原数字的前6位一模一样;而当第6位数字位于小数点后面的第6位时,也就是0.123456XXX,它会对第6位进行四舍五入,可能会跟原数字的第6位不一样了。
       所以,float的“6位有效数字”在C++和C中实际都是指在进行四舍五入的基础上保证的前6位一定准确,而准确不意味着跟原数字的前6位一模一样。
       但我们仍有以下问题,待续。。。。
       1. 当C中的float型数据小数点后不足6位,那么输出的时候小数点后6位不足的部分的数字是怎么获取的?
       2. 在C中当使用%f的时候,实际上已经指定了输出位数,而C是可以自己指定输出位数的,怎么实现呢?
       3. 为什么C++和C中有“有效位数”这一概念,也就是为什么会存在误差?
       以上问题,以后再详细阐述,今天先到这里。

【C++ Primer】详解C++和C中的float中的有效数字的更多相关文章

  1. html5的float属性超详解(display,position, float)(文本流)

    html5的float属性超详解(display,position, float)(文本流) 一.总结 1.文本流: 2.float和绝对定位都不占文本流的位置 3.普通流是默认定位方式,就是依次按照 ...

  2. 《HTML5网页开发实例详解》连载(四)HTML5中的FileSystem接口

    HTML 5除了提供用于获取文件信息的File对象外,还添加了FileSystem相关的应用接口.FileSystem对于不同的处理功能做了细致的分类,如用于文件读取和处理的FileReader和Fi ...

  3. CMU15445 之 Project#0 - C++ Primer 详解

    前言 这个实验主要用来测试大家对现代 C++ 的掌握程度,实验要求如下: 简单翻译一下上述要求,就是我们需要实现定义在 src/include/primer/p0_starter.h 中的三个类 Ma ...

  4. 共享池之八:软解析、硬解析、软软解析 详解一条SQL在library cache中解析涉及的锁

    先来张大图: 结合上图来说明一下解析的各个步骤涉及的锁. 软解析.硬解析.软软解析区别的简单说明: 为了将用户写的sql文本转化为oracle认识的且可执行的语句,这个过程就叫做解析过程. 解析分为硬 ...

  5. 共享内存shared pool (5):详解一条SQL在library cache中解析

    前面介绍的 shared pool,library cache结构,都是为了说明一条SQL是如何被解析的.先看下面的图: 图中涉及的各结构简单介绍 父HANDLE,里面有父游标堆0的地址.. 父游标堆 ...

  6. MSScriptControl详解(可实现在C#等语言中调用JAVASCRIPT代码)

    ScriptControl接口 属性名称 类型 备注 AllowUI BOOL 检测是否允许运行用户的接口元素.如果为False,则诸如消息框之类的界面元素不可见. CodeObject Object ...

  7. python3多线程应用详解(第四卷:图解多线程中LOCK)

    先来看下图形对比: 发现没有这种密集型计算的任务中,多线程没有穿行的速率快,原因就是多线程在线程切换间也是要耗时的而密集型计算任务执行时几乎没以偶IO阻塞,这样你说谁快

  8. 3dTiles 数据规范详解[3] 内嵌在瓦片文件中的两大数据表

    转载请声明出处:全网@秋意正寒 零.本篇前言 说实话,我很纠结是先介绍瓦片的二进制数据文件结构,还是先介绍这两个重要的表.思前想后,我决定还是先介绍这两个数据表. 因为这两个表不先给读者灌输,那么介绍 ...

  9. 详解线程池的作用及Java中如何使用线程池

    服务端应用程序(如数据库和 Web 服务器)需要处理来自客户端的高并发.耗时较短的请求任务,所以频繁的创建处理这些请求的所需要的线程就是一个非常消耗资源的操作.常规的方法是针对一个新的请求创建一个新线 ...

随机推荐

  1. windows cmd 切换磁盘

    抛砖引玉 切换到D盘根目录——cd /d D: 切换到D:\dev目录——cd  /d  D:\dev

  2. UESTC - 621

    f[n]:sigma(i,n),i<n g[n]:sigmaf[i],i<=n #include<bits/stdc++.h> using namespace std; con ...

  3. c# MVC返回小驼峰Json(首字母小写)

    1.与前端交互时,前端总希望传过去的json字段名首字母小写,但是.net规范是首字线大写 如果就写了下面的转换方法 /// <summary> /// Poco类字段名转换成首字母小写的 ...

  4. 【研究】Struts2-048漏洞

    1.1 漏洞背景 2017年7月7日,Apache Struts发布最新的安全公告,Apache Struts2-strus1-plugin插件存在远程代码执行的高危漏洞,漏洞编号为CVE-2017- ...

  5. 2019.3.25 SQL语句(进阶2)

    子查询 数据库中的表沿用 上一篇博客 中使用的Employee1. 练习: 1.求所有年龄比张三小的人 select * from Employee1 where age < (select a ...

  6. Win10磁盘利用率高达100%设置修改方法

    Win10磁盘利用率高达100%设置修改方法 Windows Defender关闭 Win10的Windows Defender已经变身成为安全中心,它的运行机制改成了即便是电脑中存在多个杀毒.防护软 ...

  7. quartz使用(整合spring)

    quartz与spring整合后,还是需要Scheduler实例.JobDetail实例.Trigger实例,只不过是用FactoryBean的方式创建了. 在spring-context-suppo ...

  8. linux运维基础之跟我一起学正则表达式(一)

    正则表达式 ### 二, 1) 什么是正则表达式 正则表达式又称为规则表达式 正则表达式是一个计算机的一个概念 正则表达式为了处理大量的文本|字符串而定义的一套规则和方法,通常被用来检索,替换那些符合 ...

  9. Eclipse快捷键--备忘

    [Ct rl+T] 搜索当前接口的实现类 1. [ALT +/]    此快捷键为用户编辑的好帮手,能为用户提供内容的辅助,不要为记不全方法和属性名称犯愁,当记不全类.方法和属性的名字时,多体验一下[ ...

  10. mongodb常用语句(集合操作)

    mongodb常用语句(集合操作) 查看集合帮助 db.songs.help(); 查看集合总数据量 db.songs.count(); 查看表空间大小 db.songs.dataSize(); 查看 ...