zoukankan      html  css  js  c++  java
  • 转:C语言中关于float、double、long double精度及数值范围理解

    转:C语言中关于float、double、long double精度及数值范围理解

    http://blog.sina.com.cn/s/blog_6ebd49350101gdgo.html

                  C语言中关于float、double、long double精度及数值范围理解
                      (2013-09-27 10:29:23)
      IEEE754浮点数的表示方法。C语言里对float类型数据的表示范围为-3.4*10^38~+3.4*10^38。double为-1.7*10^-308~1.7*10^308,long double为-1.2*10^-4932~1.2*10^4932.

    类型

    比特(位)数

    有效数字

    数值范围

    float

    32

    6~7

    -3.4*10^38+3.4*10^38

    double

    64

    15~16

    -1.7*10^-308~1.7*10^308

    long double

    128/

    18~19

    -1.2*10^-4932~1.2*10^4932

      究竟如何计算该范围,分析如下:
      对于单精度浮点数(float)来说,符号位一位,指数位8位,尾数23位。指数能够表示的指数范围为-128~127。尾数为23位。
    float和double的精度是由尾数的位数来决定的。浮点数在内存中是按科学计数法来存储的,其整数部分始终是一个隐含着的“1”,由于它是不变的,故不能对精度造成影响。float:2^23 = 8388608,一共七位,这意味着最多能有7位有效数字,但绝对能保证的为6位,也即float的精度为6~7位有效数字;double:2^52 = 4503599627370496,一共16位,同理,double的精度为15~16位。
      其中负指数决定了浮点数所能表达的绝对值最小的非零数;而正指数决定了浮点数所能表达的绝对值最大的数,也即决定了浮点数的取值范围。float的范围为-2^128 ~ +2^128,也即-3.40E+38 ~ +3.40E+38;double的范围为-2^1024 ~ +2^1024,也即-1.79E+308 ~+1.79E+308。
    以float为例,如下表

    符号

    尾数

    指数

    1

    23

    8

    数符(+-

    小数部分(决定精度)

    -127~128 指数(决定范围)

      例如:+1.1111111111111111111111*2^127(小数点后面23个1,由于尾数的范围1~2,其最高位总为1,故只需存取小数部分,所以小数为是23位1),约等于2*2^127=3.4*10^38。为3.4*10^38负数亦然。
      Double的计算与此类似,double的符号位为63位,指数为62~52位,共11位。表示的范围为-1024~1023。尾数为51~0。表示的范围为+1.1111111111111111..11111*2^1023(小数点后面52个1)为1.7*10^308。负数亦然。

  • 相关阅读:
    Leetcode 15 3Sum
    Leetcode 383 Ransom Note
    用i个点组成高度为不超过j的二叉树的数量。
    配对问题 小于10 1.3.5
    字符矩阵的旋转 镜面对称 1.2.2
    字符串统计 连续的某个字符的数量 1.1.4
    USACO twofive 没理解
    1002 All Roads Lead to Rome
    USACO 5.5.1 求矩形并的周长
    USACO 5.5.2 字符串的最小表示法
  • 原文地址:https://www.cnblogs.com/igfirstblog/p/9385766.html
Copyright © 2011-2022 走看看