由 double 数据类型想到的

原创 2004年05月07日 22:27:00

在解决一位网友做程序遇到的问题时,开始我百思不得其解,后来,经过进一步的分析和尝试才发现,原来并非算法的问题,而是出在 double 数据类型上,遂写此文,希望给有类似困惑的朋友们一点启发。

先写一个程序,看看结果是什么:

#include <iostream>
using namespace std;

int main()
{
  double x = 0.000000;

  for (; x<4.000000; x=x+0.100000);
  if ( 4.000000*x > 16.000000 )
    printf ("4x = %f, x = %f/n", 4*x, x);

  return 0;
}

因为 4*x = 16,所以,在通常看来,这个程序它并不应该输出什么东西,可是事实上它却输出了:

4x = 16.000000, x = 4.000000

于是,我就在 printf 那儿设置一个断点,进入调试,会发现此时

x = 4.0000000000000018

如下图所示:

但是,如果写个简单一点的却又是另外一种情况:

#include <iostream>
using namespace std;

int main()
{
  double x = 0.000000;
 
  x += 0.100000;
  if ( x > 0.100000 )
    printf ("x = %f/n", x);

  return 0;
}

经调试发现 x = 0.1000000000000001 而且,此时似乎又正常了,不输出任何东西。

如果把 x 自加 10 次 0.100000 你会发现结果的 x 不是 1.000000 ,在 Visual C++ 6.0 里的结果是 x = 0.99999999999999989,如果把它和 1 去比较的话,它会显示比 1 小了。

记得以前有个网友就报怨:“double 的范围是多大啊?MSDN 里关于 double 的英文表述看不明白...”,我看了一下,MSDN 上写的是:

The double type contains 64 bits: 1 for sign, 11 for the exponent, and 52 for the mantissa. Its range is +/–1.7E308 with at least 15 digits of precision.

意思是说,double 数据类型由 64 位构成,1 位标志位、11 位指数位、其余 52 位用来表示数字,范围是 +/–1.7E308 精度至少为 15 位。

不过,要了解 double 的范围大小也可以写程序搞定了,比如:

// DoubleRange.cpp 2004-04-10 WGF Wuhan
#include<iostream>
#include<limits>

using namespace std;

int main()
{
  cout << "double range: " << numeric_limits<double>::min()
    << " " << numeric_limits<double>::max() << endl;

  return 0;
}

输出结果为:

double range: 2.22507e-308 1.79769e+308

所以,double 类型是不精确的,在进行大小判断时,不能把它与某个确切的值进行比较,而是应该给个范围;我们可以用程序的方式切实地了解一个数据类型的一些特性,这样既是一种锻炼又可以把知识点掌握得更加牢固。

float数据类型及double数据类型整理

float数据类型及double数据类型内存存储及精度分析;
  • sinat_19447667
  • sinat_19447667
  • 2017年02月15日 21:27
  • 358

c语言基本数据类型(short、int、long、char、float、double)

一 C 语言包含的数据类型 short、int、long、char、float、double 这六个关键字代表C 语言里的六种基本数据类型。 在不同的系统上,这些类型占据的字节长度是不同...
  • wfreehorse
  • wfreehorse
  • 2017年03月06日 19:29
  • 826

int,double,char类型的排序

//int排序 #include #include int main() { int cmp ( const void *a , const void *b ); int num[5]; ...
  • zhulingyan1018
  • zhulingyan1018
  • 2015年09月13日 18:23
  • 340

不同语言基本数据类型(int、char、float、double....)对应字节大小

一)64位系统和32位有什么区别?  1、64bit CPU拥有更大的寻址能力,最大支持到16GB内存,而32bit只支持4G内存 2、64位CPU一次可提取64位数据,比32位提高了一倍...
  • langjian2012
  • langjian2012
  • 2014年04月08日 20:50
  • 2936

C++ vector数据类型的用法

开发的时候一旦要用到一串自定义类或者一串结构体,并且要对这一串数据进行插入、索引、提取等操作的时候,我就会想到vector,虽然有时候会有种杀鸡用牛刀的感觉,但是大多数情况下能把问题解决就好了,至于效...
  • ihadl
  • ihadl
  • 2013年09月26日 19:33
  • 4101

J2se源码剖析 基本数据类型double

前言今天要分析的Double源码与我上一篇博客的 java源码剖析 Inteager都是属于 java.lang中的,并且都是继承于Number,都实现了Comparable,在上一篇博客中我没有详...
  • qq_33048603
  • qq_33048603
  • 2016年08月27日 16:01
  • 891

UDP编程开端(发送double类型)

有两点值得注意: 1。UDP编程的基本框架 服务器端: DatagramSocket ds=new DatagramSocket(服务器的端口); byte[]b=new byte[1024]...
  • qq_33665647
  • qq_33665647
  • 2016年08月17日 20:38
  • 418

一种Elasticsearch数据类型冗余方案

在互联网环境中,我们从不指望用户都是规矩的玩家。
  • cnweike
  • cnweike
  • 2014年08月06日 11:31
  • 7350

JAVA基本数据类型范围和float、double精度问题

1.八中数据类型的分类如下:  第一类:整型 byte short int long 第二类:浮点型 float double 第三类:逻辑型 boolean(它只有两个值可取true false) ...
  • zc_ad
  • zc_ad
  • 2016年11月30日 09:56
  • 1835

【iOS开发】OC变量和基本数据类型-精度

oc数据类型数据类型:基本数据类型、指针数据类型基本数据类型:数值型、字符型(char)、布尔型、空类型(void)指针数据类型:类(class)、id数值型:整数类型int、浮点型float、dou...
  • Hanrovey
  • Hanrovey
  • 2017年01月13日 14:04
  • 1646
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:由 double 数据类型想到的
举报原因:
原因补充:

(最多只允许输入30个字)