在《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. redis 连接字符串,设置密码

    <add name="Abp.Redis.Cache" connectionString="127.0.0.1:6379,password=123456" ...

  2. MNIST数据集分类简单版本

      import tensorflow as tf from tensorflow.examples.tutorials.mnist import input_data #载入数据集 mnist = ...

  3. npm install 卡住的时候的处理

    [From] http://www.eguidedog.net/doc/what-to-do-when-npm-install-hangs.php 翻译一下,npm install 经常卡在下载某个包 ...

  4. GreenPlum 大数据平台--运维(一)

    .最后分析或真空或创建表或等... Select * from pg_stat_operations where schemaname='SCHEMA NAME ' and actionname in ...

  5. Android IntentFilter 匹配原则浅析

    1 Intent分为两大类,显式和隐式. 显式事件,就是指通过 component Name 属性,明确指定了目标组件的事件. 比如我们新建一个Intent,指名道姓的说,此事件用于启动名为" ...

  6. TOJ 1721 Partial Sums

    Description Given a series of n numbers a1, a2, ..., an, the partial sum of the numbers is defined a ...

  7. Python 函数运行时更新

    Python 动态修改(运行时更新) 特性 实现函数运行时动态修改(开发的时候,非线上) 支持协程(tornado等) 兼容 python2, python3 安装 pip install realt ...

  8. bzoj 5329: [Sdoi2018]战略游戏

    Description 省选临近,放飞自我的小Q无心刷题,于是怂恿小C和他一起颓废,玩起了一款战略游戏. 这款战略游戏的地图由n个城市以及m条连接这些城市的双向道路构成,并且从任意一个城市出发总能沿着 ...

  9. 深入理解JavaScript系列(37):设计模式之享元模式

    介绍 享元模式(Flyweight),运行共享技术有效地支持大量细粒度的对象,避免大量拥有相同内容的小类的开销(如耗费内存),使大家共享一个类(元类). 享元模式可以避免大量非常相似类的开销,在程序设 ...

  10. [转]win7 如何升级PowerShell

    本文转自:http://www.cnblogs.com/wenBlog/p/6198354.html 背景: 开发的PowerShell 脚本需要使用Invoke-RestMethod命令,发现在老的 ...