搜索
查看: 1160|回复: 8
打印 上一主题 下一主题

超级新人求助

[复制链接]
跳转到指定楼层
楼主
发表于 2013-11-7 11:04:23 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
5啊哈币
本书第30页有个小例子
#include <stdio.h>
#include <stdlib.h>
int main()
{
        float a,b,c;
    a=5.2;
    b=3.1;
    c=a+b;
    printf("%f",c);
        system("pause");
        return 0;
}

为啥编译显示结果是8.299999
而不是8.3啊?

3333333.jpg (24.92 KB, 下载次数: 7)

3333333.jpg

最佳答案

查看完整内容

假设有一个数列{1/2, 1/4, 1/8, 1/16, 1/32, ... 1/(2^n), ...} 每个用一次,你能用它们的有限多项加和而得到0.3吗? 不能的对吧? 这和原问题有什么关系来着?想想0.3在计算机中要怎么表示吧 0.5只要 1/2一项就可以了 0.375 = 0.125 + 0.25 = 1/4 + 1/8 0.875 = 0.5 + 0.25 + 0.125 = 1/2 + 1/4 + 1/8 而0.3不可以,所以注定在这种计数法下只能表达为近似值
沙发
发表于 2013-11-7 11:04:24 | 只看该作者
本帖最后由 rosynirvana 于 2013-11-7 13:37 编辑

假设有一个数列{1/2, 1/4, 1/8, 1/16, 1/32, ... 1/(2^n), ...}
每个用一次,你能用它们的有限多项加和而得到0.3吗?

不能的对吧?
这和原问题有什么关系来着?想想0.3在计算机中要怎么表示吧
0.5只要 1/2一项就可以了
0.375 = 0.125 + 0.25 = 1/4 + 1/8
0.875 = 0.5 + 0.25 + 0.125 = 1/2 + 1/4 + 1/8
而0.3不可以,所以注定在这种计数法下只能表达为近似值
板凳
 楼主| 发表于 2013-11-7 14:45:26 | 只看该作者
rosynirvana 发表于 2013-11-7 11:04
假设有一个数列{1/2, 1/4, 1/8, 1/16, 1/32, ... 1/(2^n), ...}
每个用一次,你能用它们的有限多项加和而得 ...

为啥一定要 1/2, 1/4, 1/8, 1/16, 1/32, ... 1/(2^n), ...这些相加呢?

不能0.3=1/5+1/10 吗  还是有点糊涂,希望再解释下。谢谢
地板
发表于 2013-11-7 14:51:17 | 只看该作者
coolllyy 发表于 2013-11-7 14:45
为啥一定要 1/2, 1/4, 1/8, 1/16, 1/32, ... 1/(2^n), ...这些相加呢?

不能0.3=1/5+1/10 吗  还是有 ...

像这样:1÷3=0.33333333333·······但0.333333333333······×3就不是一了,总是差那一个0.000000000······1
5#
发表于 2013-11-7 14:51:24 | 只看该作者
coolllyy 发表于 2013-11-7 14:45
为啥一定要 1/2, 1/4, 1/8, 1/16, 1/32, ... 1/(2^n), ...这些相加呢?

不能0.3=1/5+1/10 吗  还是有 ...

像这样:1÷3=0.33333333333·······但0.333333333333······×3就不是一了,总是差那一个0.000000000······1
6#
发表于 2013-11-7 14:53:57 | 只看该作者
coolllyy 发表于 2013-11-7 14:45
为啥一定要 1/2, 1/4, 1/8, 1/16, 1/32, ... 1/(2^n), ...这些相加呢?

不能0.3=1/5+1/10 吗  还是有 ...

因为计算机用二进制,每个数位都表示 2^n
{... 1024, 512, 256, 128, 64, 32, 16, 8, 4, 2, 1, 0, 0.5, 0.25, 0.125, ....}

当然你可以说写成 83 * (10 ^ (-1)), 然后就全是整数了,都可以用二进制精确表达了
但是因为效率低下等等原因这样做不适合做成芯片,所以标准(ISO/IEEE 754)上规定是用二进制小数来进行计数的

具体来说一个32比特的浮点数,第一位标示符号,2-8位表示指数,或者说2 ^ x之中的x是多少,然后剩下24位表示尾数,n * 2 ^ x之中的n
不过如果只是要理解为什么不精确,我觉得用最上面说的等比数列加和就够了
7#
 楼主| 发表于 2013-11-7 14:58:50 | 只看该作者
知道了,多谢各位大侠。
8#
发表于 2013-11-7 21:16:39 | 只看该作者
因为浮点型是以IEEE754标准转化为二进制代码存储在计算机中的,
导致不能保证准确的存储每一个数,可能存储的是一个近似的值。


例如:# include <stdio.h>

            int main(void)
           {
                  float i=99.9;
       
                  printf(" %f ", i);       

                  return 0;
            }
9#
发表于 2013-11-7 22:48:09 | 只看该作者
Doctorly 发表于 2013-11-7 21:16
因为浮点型是以IEEE754标准转化为二进制代码存储在计算机中的,
导致不能保证准确的存储每一个数,可能存储 ...

不一定是IEEE754浮点数,通常是
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

广播台
特别关注
快速回复 返回顶部 返回列表