gpt4 book ai didi

C:负数和余数背后的数学

转载 作者:行者123 更新时间:2023-12-04 00:40:57 24 4
gpt4 key购买 nike

这似乎是处理 Remainder/Mod 时被问到的第一件事,我有点碰壁了。我正在用一本教科书和一堆 C 代码自学编程。

看到我真的没有教练说,“不,不。它实际上是这样工作的”,我想我会在这里尝试一下。不过,我还没有找到这个数学部分的最终答案。

所以...我的印象是这种情况很少见,但我仍然想知道 Shiny 的编译背后发生了什么。另外,这本教科书希望我根据 C89 标准提供使用负余数时所有可能的值。如果有人可以检查一下这个数学是否合理,会不会很麻烦?

1) 9%4
9 - (2) * 4 = 1 //this is a value based on x - (x/y) * y
(2) * 4 + (1) = 9 //this is a check based on (x/y) * y + (x%y) = x

2) -9%4
9 - (2) * 4 = 1; 9 - (3) * 4 = -3 //these are the possible values
(2) * 4 + (1) = 9; (3) * 4 + (-3) = 9 //these are the checks

3) 9%-4
Same values as #2??

我尝试用表达式中的负数进行计算,结果得出了 17 和 -33 等荒谬的结果。 #3 也是 1 和 -3 吗??

4) -9%-4
Same as #1??

在代数除法中,负号“抵消”。他们在这里做同样的事情,还是有其他事情发生?

我认为最让我困惑的是底片。我在学校学习代数的方式(5-6 年前),他们“依附”于他们的数字。在编程中,既然是一元运算符,那不是吗?示例:在 #2 上填写 x 的值时,x = 9 而不是 x = -9。

我真诚地感谢任何帮助。

最佳答案

这里需要余数的数学定义。

给定两个整数 m, d,我们说 rm 除法的余数> 和 d 如果 r 满足两个条件:

  • 存在另一个整数k 使得m == k * d + r , 和
  • 0 <= r < d .

对于正数,在 C 中,我们有 m % d == rm / d == k , 只需遵循上面的定义。

由定义可知,3 % 2 == 1 and 3/2 == 1。
其他例子:

4 / 3 == 1 and 5 / 3 == 1, in despite of 5.0/3.0 == 1.6666 (which would round to 2.0).

4 % 3 == 1 and 5 % 3 == 2.

您也可以相信公式 r = m - k * d ,在 C 中写为:

m % d == m - (m / d) * d

然而,在标准C中,整数除法遵循规则:round to 0 .
因此,对于负操作数,C 提供与数学结果不同的结果。
我们会:

(-4) / 3 == -1, (-4) % 3 == -1 (in C), but in plain maths: (-4) / 3 = -2, (-4) % 3 = 2.

在简单的数学中,余数总是非负的,并且小于 abs(d) .
在标准 C 中,余数始终带有第一个操作数的符号。

 +-----------------------+ |  m  |  d  |  /  |  %  | +-----+-----+-----+-----+ |  4  |  3  |  1  |  1  | +-----+-----+-----+-----+ | -4  |  3  | -1  | -1  | +-----+-----+-----+-----+ |  4  | -3  | -1  |  1  | +-----+-----+-----+-----+ | -4  | -3  |  1  | -1  | +-----------------------+

备注:此说明(在否定的情况下)仅适用于标准 C99/C11。你必须小心你的编译器版本,并做一些测试。

关于C:负数和余数背后的数学,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18798419/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com