V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
blublu
V2EX  ›  问与答

有没有精通底层的大神,为什么同一个实数赋值给 float 型变量和 double 型变量,输出结果会有所不同?

  •  
  •   blublu · 2016-10-19 00:22:23 +08:00 · 3616 次点击
    这是一个创建于 2957 天前的主题,其中的信息可能已经有所发展或是发生改变。

    将同一实数分别赋值给单精度和双精度类型变量,然后打印输出。

    #include <stdio.h>
    main()
    {
    	float a;
    	double b;
    	a = 123456.789e4;
    	b = 123456.789e4;
    	printf(“%f/n%f/n ”,a,b);
    }
    ```		
    运行结果如下:
    1234567936.000000
    1234567890.000000
    
    问题:为什么同一个实数赋值给 float 型变量和 double 型变量,输出结果会有所不同呢?
    
    6 条回复    2016-10-19 09:38:18 +08:00
    co3site
        1
    co3site  
       2016-10-19 00:47:44 +08:00 via Android   ❤️ 1
    float 和 double 的精度取决于尾数的位数.
    float 尾数位有 23 位,而 double 尾数位有 52 位
    2^23 = 8388608 一共七位,则 float 的精度为 6-7 为位
    2^52 = 4503599627370496 一共 16 位,那么 double 的精度为 15-16 位
    msg7086
        2
    msg7086  
       2016-10-19 00:58:36 +08:00
    这两个结果不都是 123456.789e4 吗?
    bazingaterry
        3
    bazingaterry  
       2016-10-19 01:02:48 +08:00
    哈哈不需要精通底层吧, 1L 基本说清楚了。
    ryd994
        4
    ryd994  
       2016-10-19 02:59:40 +08:00 via Android
    低位低于最小进度被约掉了
    不砍掉点精度, float 和 double 有什么区别嘛
    zhujinliang
        5
    zhujinliang  
       2016-10-19 08:36:24 +08:00 via iPhone
    我一直没意识到 float 精度是这么低
    aheadlead
        6
    aheadlead  
       2016-10-19 09:38:18 +08:00
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2426 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 16:02 · PVG 00:02 · LAX 08:02 · JFK 11:02
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.