当前位置:  开发笔记 > 编程语言 > 正文

在精度损失不可接受的情况下,有任何合理的理由使用双精度来存储整数吗?

如何解决《在精度损失不可接受的情况下,有任何合理的理由使用双精度来存储整数吗?》经验,为你挑选了1个好方法。

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

#include 

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

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

然后备注:

可能有可能通过使用 double

并展示此程序的替代版本:

#include 

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

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

double这里使用a 有意义吗?似乎没有;a long long肯定会更好,因为它可以在同一空间中存储比双罐更大的整数(不损失精度),并通过在声明时传达该变量是整数来提高可读性。

是否存在使用double我遗失的a的合理性,还是K&R示例只是为了说明double类型而臭名昭著的普通错误代码?



1> John Bolling..:

doublelong

在精度损失不可接受的情况下,有任何合理的理由使用双精度来存储整数吗?[...]在这里使用double有意义吗?

即使在C2011,类型long可以具有少至31值的位,因此其范围表示的值的可以是小到从-2 31 2 31 - 1(假设二的补码表示;稍窄用符号/幅值表示)。

C没有指定浮点值表示的详细信息,但如今IEEE-754表示已接近普遍。C double几乎总是以IEEE-754二进制双精度格式表示,该格式提供53位尾数。该格式可以精确表示-(2 53-1)到2 53-1的所有整数,并且如果按照IEEE规范执行并且数学结果和所有中间值都可以精确表示,则将完全执行涉及这些数字的算术运算整数(有时甚至不是)。

因此,使用double代替long确实可以在不牺牲精度的情况下产生更大的数值范围。

doublelong long

肯定long long会更好[...]

long long具有较大的范围(精确地)比表示的整数值double,因此,没有理由偏爱double超过long long对整数如果后者是可用的。但是,正如在评论中所观察到的那样,long long在K&R的第一版于1978年发行时就不存在,甚至在1988年第二版发行时,它也远远没有达到标准。因此,long longKernighan和Ritchie不在考虑其他选择。确实,尽管许多C90编译器最终都支持它作为扩展,long long但直到C99才被标准化。

无论如何,我倾向于认为让您感到困惑的话并不是double为了达到目的而使用该字眼,而是作为对的比较范围的补充说明double

推荐阅读
可爱的天使keven_464
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有