我是C的新手,我很难理解这些材料。我真的需要帮助!请有人帮忙。
在算术中,任何两个正整数的总和都比以前要好:
(n+m) > n for n, m > 0
(n+m) > m for n, m > 0
C有一个加法运算符+。此算术规则是否在C?
中保留我知道这是假的。但是可以请有人向我解释为什么这样,我能理解吗?请提供反例?
提前谢谢。
答案 0 :(得分:7)
(我不会为你解决这个问题,但会提供一些指示。)
由于不同的原因,对于整数和浮点运算都是错误的。
m
添加非常小的浮点数n
会返回n
。阅读What Every Computer Scientist Should Know About Floating-Point Arithmetic。答案 1 :(得分:4)
它并不成立,因为C的整数不是"抽象的"无限大小的整数,即真正的整数(在数学中)。
在C中,整数是离散的和数字的,并且使用固定数量的位来实现。这会导致范围有限,并且当您(尝试)超出范围时会出现问题。通常整数将换行,这是非常自然的"。
答案 2 :(得分:0)
我简短的搜索没有显示描述这些的好答案,所以我宁愿在这里很好地回答这个问题,对于初学者来说。
当然,答案是错误的,但为什么会这样呢?
<强>整数强>
在C或任何提供某种整数类型的编程语言中,这种类型并不意味着它在数学意义上。在数学意义上,非负整数的范围从0到无穷大。然而,计算机只有有限的存储空间,因此整数必然会被限制在小于无穷大的范围内。
仅此一项证明a + b > a
和a + b > b
不能一直为真,因为它可以设置,因此a
和b
都小于最大值计算机可以在其存储中表示的数字,但a + b
大于该数字。
这里到底发生了什么,取决于。有人提到环绕,但情况并非如此。 C语言首先将整数溢出定义为未定义行为,如果代码恰好踩到它上,可能会发生包括火和烟在内的任何事情(当然在现实中不会发生了,但严格地解释标准,以及违反时空连续体。)
我不会描述环绕如何在这里工作,因为它超出了问题本身的范围。
浮点
这里的情况与整数的情况大致相同:理解为什么数学不能完全适用的关键是计算机的存储空间有限。
计算机内存中的浮动数字与科学记数法很相似:尾数和指数。 这两个具有固定的有限范围,具体取决于浮点变量的类型。
在基数10中,你可以设想这个,就像你的指数范围从10 ^ -10
到10 ^ 10
,并且尾数在小数点后面有4个小数位,总是标准化。
考虑到这一点,请检查以下示例添加:
1.2345 * (10 ^ 0) + 1.0237 * (10 ^ 5)
5.2345 * (10 ^ 10) + 6.7891 * (10 ^ 10)
第一个是一个例子,其中结果将等于其中一个输入数字,而两者都大于零。第二个是结果超出范围的例子。
然而,计算机使用的浮点表示能够表示 infinity ,其中两个表示:正无穷大和负无穷大。因此,虽然第一个示例作为证明传递,但第二个示例没有,因为该添加的结果是正无穷。
但考虑到这一点,您可以制作另一个校对示例:
3.1416 * (10 ^ 0) + (+ infinity)
当然结果是正无穷,无论你把它添加到什么地方。当然正无穷不大于正无穷,所以再次证明。