zoukankan      html  css  js  c++  java
  • 学习笔记:浮点数的表示方法,区别long和double

    浮点数的表示方法

    IEEE754浮点数的表示方法:N = (-1)^s x m x 2^e,其中s为符号位,m是尾数位,e是指数位。

    种类 符号位 指数位 尾数位
    float 第31位(占1bit) 第30-23位(占8bit) 第22-0位(占23bit)
    double 第63位(占1bit) 第62-52位(占11bit) 第51-0位(占52bit)

    对于单精度浮点数(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.

    具体计算公式N = (-1)^s x m x 2^e,以float为栗子,但s=0,m=23,e=8时:

    +1.1111111111111111111111 x 2^127(小数点后面23个1,由于尾数的范围1~2,其最高位总为1,故只需存取小数部分,所以小数为是23位1),约等于2 x 2^127=3.4 x 10^38。负数亦然。

    long和double的区别

    long表示的是一个整型的数据,在不同系统或语言定义可能不同,在内存32位或64位,即表示的是一个有32/64位二进制数表示的一个整数,最大为 2^63-1.

    但double不一样,表示的是浮点数,以EEE754浮点数表示方法为:N = (-1)^s x m x 2^e,其范围和精度是由其指数和位数决定的。所说的32位或64位是指该浮点数的符号位+指数位+尾数位.

    两者在表示形式就不一样,而不能简单地根据数据所占位数去比较它们的大小。

    补充:理解32位系统和64位系统

    32位系统CPU一次可处理32位数据,即一次处理4个字节;64位系统CPU一次可处理64位数据,即一次处理8个字节。

    x86与x86-64有什么区别呢?x86指的是一般意义上的32位Intel处理器;而x86_64 则是一般意义上的64位Intel处理器。

  • 相关阅读:
    loj#6433. 「PKUSC2018」最大前缀和(状压dp)
    PKUWC2019游记
    10. Regular Expression Matching
    9. Palindrome Number
    8. String to Integer (atoi)
    7. Reverse Integer
    6. ZigZag Conversion
    5. Longest Palindromic Substring
    4. Median of Two Sorted Arrays
    3. Longest Substring Without Repeating Characters
  • 原文地址:https://www.cnblogs.com/microbit1024/p/11622714.html
Copyright © 2011-2022 走看看