Math 除法、余数和仅允许实数

Math 除法、余数和仅允许实数,math,division,Math,Division,试图找出这个伪代码。假设如下。。。。 我只能使用无符号和有符号整数(或长整数)。 除法返回一个不带余数的实数。 MOD返回一个实数。 分数和小数不被处理 INT I = 41828; INT C = 15; INT D = 0; D = (I / 65535) * C; 在这种情况下,您将如何处理分数(或十进制值)?有没有办法用负值来表示余数 在这个例子中,I/65535应该是0.638,但是,由于限制,我得到了0,MOD为638。我怎样才能乘以C得到正确的答案 希望这是有道理的 这里的MO

试图找出这个伪代码。假设如下。。。。 我只能使用无符号和有符号整数(或长整数)。 除法返回一个不带余数的实数。 MOD返回一个实数。 分数和小数不被处理

INT I = 41828;
INT C = 15;
INT D = 0;

D = (I / 65535) * C;
在这种情况下,您将如何处理分数(或十进制值)?有没有办法用负值来表示余数

在这个例子中,I/65535应该是0.638,但是,由于限制,我得到了0,MOD为638。我怎样才能乘以C得到正确的答案

希望这是有道理的


这里的MOD实际上返回23707,而不是638。(我希望我是对的:)

如果你在最后一行上切换操作顺序,你会得到你想要的整数答案(9,如果我的计算是正确的)


这就是你想要的答案吗?

假设这些是你在计算中经常使用的值,那么我会做如下操作:

D = I / (65535 / C); D=I/(65535/C); 或

D = I / 4369; D=I/4369; 因为C是65535的系数。这将有助于减少溢出可用整数范围的可能性(即,如果只有16位无符号整数)

在更一般的情况下,如果您认为I和C的乘法会导致一个值超出您使用的整数类型的允许范围(即使最终结果在该范围内),您可以将分子和分母的值计算出来,如下所示:

INT I = 41828; INT C = 15; INT DEN = 65535; INT GCDI = GCD(I, DEN); DEN = DEN / GCDI; I = I / GCDI; INT GCDC = GCD(C, DEN); DEN = DEN / GCDC; C = C / GCDC; INT D = (I * C) / DEN; INT I=41828; INT C=15; INT DEN=65535; INT GCDI=GCD(I,DEN); DEN=DEN/GCDI; I=I/GCDI; INT GCDC=GCD(C,DEN); DEN=DEN/GCDC; C=C/GCDC; INT D=(I*C)/DEN; 其中,DEN是分母(本例中为65535)。这并不能在所有情况下为您提供正确的答案,特别是如果I和C都是DEN和I*C>MAX_INT的互质


至于您提出的更大的问题,整型值的除法总是会丢失十进制分量(相当于floor函数)。保存包含在我们所认为的“小数”部分中的信息的唯一方法是通过从模数中导出的余数。我强烈建议大家不要混淆这些不同数字系统的含义。整数就是那个整数。如果您需要它们是浮点数,那么您应该真正使用浮点数,而不是整数。如果您感兴趣的只是将小数部分显示给用户(即,您实际上没有将其用于进一步计算),那么您可以编写一个例程,将余数转换为表示余数的字符串。

处理小数的一种方法是使用此替换除法函数。这种技术有许多明显的缺点

ALT DIV (dividend, divisor) returns (decimal, point)
for point = 0 to 99
  if dividend mod divisor = 0 return dividend / divisor, point
  dividend = divident * 10
return dividend / divisor, 100

对不起,我不明白。什么是MOD?MOD返回剩余部分。所以,假设我有6/4 DIV将返回1,MOD将返回2。我需要编辑上面的答案…638不适用于MOD.)我刚才看到了。我想这对我来说可能有用。如果有人对在我描述的情况下如何处理小数有一个答案,我很乐意听到。我发布了一个建议的机制来处理小数。但是它真的很难看。
ALT DIV (dividend, divisor) returns (decimal, point)
for point = 0 to 99
  if dividend mod divisor = 0 return dividend / divisor, point
  dividend = divident * 10
return dividend / divisor, 100