- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在从 K&R(第二版)学习 C,并且对本书早期的示例之一感到困惑。在 1.5.2 节中,本书首先展示了一个字符计数程序,如下所示:
#include <stdio.h>
/* count characters in input; 1st version */
main()
{
long nc;
nc = 0;
while (getchar() != EOF)
++nc;
printf("%ld\n", nc);
}
然后备注:
It may be possible to cope with even bigger numbers by using a
double
并展示该程序的替代版本:
#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 jar 更大的整数(不损失精度),并且通过在声明时传达变量是整数来提高可读性。
是否有我遗漏的使用 double
的理由,或者 K&R 示例只是为了演示 double
类型而硬塞进的普通错误代码?
最佳答案
double
与 long
Is there any rational reason to use a double to store an integer when precision loss isn't acceptable? [...] Does using a double here make any sense?
即使在 C2011 中,键入 long
可能只有 31 个值位,因此它的可表示值范围可能小到从 -231 到 231 - 1(假设二进制补码表示;略更窄的符号/幅度表示)。
C 没有指定浮点值表示的细节,但 IEEE-754 表示如今已近乎通用。 C double
s 几乎总是以 IEEE-754 二进制 double 格式表示,它提供 53 位尾数。该格式可以精确表示从-(253 - 1)到253 - 1的所有整数,如果按照IEEE 规范以及数学结果和所有中间值是否是可精确表示的整数(有时甚至不是)。
所以使用 double
而不是 long
确实可以在不牺牲精度的情况下产生更大的数值范围。
double
与 long long
surely a
long long
would be superior [...]
long long
具有比 double
更大范围的(精确)可表示整数值,因此没有理由更喜欢 double
在 long long
对于整数,如果后者可用。然而,正如评论中所观察到的,long long
1978年K&R第一版出版时还没有,1988年第二版出版时也远未达到标准。因此,long long
不在 Kernighan 和 Ritchie 考虑的备选方案之列。事实上,虽然许多 C90 编译器最终支持它作为扩展,long long
直到 C99 才标准化。
无论如何,我倾向于认为让您感到困惑的言论并不是对使用 double
的认可。为此,作为关于 double
比较范围的边栏评论.
关于c - 当不能接受精度损失时,是否有合理的理由使用 double 来存储整数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34503160/
您好,我希望我的下一个输出(在本例中就是字母)在上一个输出之后输出 8 个空格。这适用于第一个字符,但之后的 printf 语句不起作用。它在第一个 printf 语句之后立即打印,我试图将其设置为
我想知道制作 std::list<>::splice 背后的基本原理是什么使引用被拼接到新容器中的子序列的迭代器无效。这对我来说有点不合逻辑,尤其是考虑到标准 std::container::swap
谁能告诉我为什么我应该使用 Azure Function 输出绑定(bind)(例如 SendGrid 或 Twilio)而不是仅仅在我的 C# 函数中显式使用适当的 SDK(例如 Sendgrid
我们在当前项目中使用 React 和 TypeScript,我遇到了以下行为。 import React, { Component } from 'react'; 我将上面的行替换为下面的行,因为它似
我是一名优秀的程序员,十分优秀!