• 据说有99%的人都会做错的面试题


          这道题主要考察了面试者对浮点数存储格式的理解。

    另外,请不要讨论该题本身是否有意义之类的话题。本题仅仅为了測试面试者相关的知识是否掌握,题目本身并没有实际的意义。

          以下有6个浮点类型变量,当中前三个是float类型的。后三个是double类型的。题目的代码例如以下:

    float f_v1 = 20;
    float f_v2 = 20.3;
    float f_v3 = 20.5;
        
    double d_v1 = 20;
    double d_v2 = 20.3;
    double d_v3 = 20.5;
        
    cout << ((f_v1 == d_v1)?

    "true":"false") << endl; cout << ((f_v2 == d_v2)?

    "true":"false") << endl; cout << ((f_v3 == d_v3)?"true":"false") << endl;


    问题有例如以下三个:

    1. 本题的执行结果是什么
    2. 请依据本题的执行结果解释其原因
    3. 假设某个cout语句的输出结果为false,在不改变变量定义语句的前提下,怎样扔弃相等呢?

    以下我先简要说说怎样解答本题。最后再给出答案。

         首先应先了解float和double的存储方式。这里先拿float为例。float一共占4个字节,共32位。分为3部分:符号位、指数位和尾数位。分别占1位、8位和23位。存储结构如图1所看到的。


    图1

         当中假设浮点数为正值,符号位为0。否则为1。指数位採用移位存储,也就是假设表示10^4。须要将4与127(二进制是01111111)相加存入指数位。

    尾数位决定了float的精度。

    尾数一共23位,最多能够表示8388607个值,由于没有到9999999,所以float的精度为6,假设表示的数小于8388608,那么精度可到7位。这也是为什么有的书中说float的精度是6到7位的原因。这里并非全部的数都能精确到7位。

        另外。所谓的精度是指科学计数法E前面的数字的小数个数。

    比如。1.2345678E10。

    这个数用float表示是能够精确到7位。由于2345678小于8388608。

    假设是1. 9388648E10,那么就仅仅能精确到6位了。

    假设理解了这个,还须要了解怎样将十进制浮点数转换为二进制浮点数,别告诉我你不会,假设真不会的话,回大学从念吧。总之,浮点数转换是分别转换整数和小数部分。整数部分除2,小数部分乘2。比如,20.5转换为二进制是10100.1。20.3转换为二进制例如以下:

    10100.0100110011001...1001

        当中“...”表示1001部分无限循环。也就是说20.3转换为二进制浮点数是一个而无限循环的二进制浮点数。

    最后。须要知道怎样用科学计数法表示二进制浮点数(长见识了吧,二进制也能够用科学计数法)。20.5的科学计数法表示是:1.01001E100

    20.3的科学计数法表示是:1.0100010011001...E100

    如今就能够一个萝卜一坑个了,将相应的数填入图1的三个区域吧。

     

        如今将20.5和20.3都存入double类型的变量,就能够一下看出本题的结果了。double占64位。8个字节。

    符号位占1位。指数位占11位,尾数位占52位。精度是15或16,原理和float一样。

     

    如今发布一下答案:

    true

    false

    true

     

    假设还没理解当中的奥秘,能够看具体的视频解说


  • 相关阅读:
    Java实现 LeetCode 802 找到最终的安全状态 (DFS)
    Java实现 LeetCode 802 找到最终的安全状态 (DFS)
    Java实现 LeetCode 802 找到最终的安全状态 (DFS)
    Java实现 LeetCode 804 唯一摩尔斯密码词 (暴力)
    Java实现 LeetCode 803 打砖块 (DFS)
    Java实现 LeetCode 804 唯一摩尔斯密码词 (暴力)
    Java实现 LeetCode 803 打砖块 (DFS)
    Java实现 LeetCode 804 唯一摩尔斯密码词 (暴力)
    英文标点
    post sharp 与log4net 结合使用,含执行源码 转拷
  • 原文地址:https://www.cnblogs.com/llguanli/p/6757376.html
Copyright © 2020-2023  润新知