首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在精度损失不可接受的情况下,是否有合理的理由使用double来存储整数?

问在精度损失不可接受的情况下,是否有合理的理由使用double来存储整数?
EN

Stack Overflow用户
提问于 2015-12-29 01:23:06
回答 1查看 489关注 0票数 5

我正在从K&R (第二版)学习C,我对这本书早期的一个例子感到困惑。在1.5.2节中,本书首先展示了一个字符计数程序,如下所示:

代码语言:javascript
复制
#include <stdio.h>

/* count characters in input; 1st version */
main()
{
    long nc;

    nc = 0;
    while (getchar() != EOF)
        ++nc;
    printf("%ld\n", nc);
}

然后评论:

使用double可能会处理更大的数字。

并展示了这一方案的替代版本:

代码语言:javascript
复制
#include <stdio.h>

/* count characters in input; 2nd version */
main()
{
    double nc;

    for (nc = 0; getchar() != EOF; ++nc)
        ;
    printf("%.0f\n", nc);
}

在这里使用double有意义吗?它似乎并不是这样;当然,long long会更优越,因为它可以在相同的空间中存储比双罐(不丢失精度)更大的整数,并且通过在声明时传递变量是整数来帮助提高可读性。

在这里使用double是有什么理由的吗?或者K&R示例只是简单的糟糕代码,这些代码都是用来演示double类型的吗?

EN

回答 1

Stack Overflow用户

发布于 2015-12-29 02:58:56

在旧的32位计算机中,使用“长长”比使用“双”更昂贵。因为使用“长长”,每个64位整数的加法都需要由2个CPU指令计算:"ADD“& "ADC”。但是,通过使用“双”,仅增加一个FPU就足以增加计数器。在IEEE-754标准中,"double“的精度为53位(1位符号+ 11位指数+ (52+1隐式)位尾数),可以表示任何在-2^53,2^53范围内的整数。

虽然在64位计算机中,通常长的长比较好,但是仍然可能有一些情况下使用“双”可以执行得更快。例如,如果启用了超线程,那么FPU和整数单元都可以由不同的线程同时进行操作。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34503160

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档