分区,剩余和仅允许的实数

时间:2010-04-02 21:51:25

标签: math division

试图找出这个伪代码。假设如下...... 我只能使用无符号和有符号整数(或长整数)。 除法返回一个没有余数的实数。 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.(我希望我是对的:))

3 个答案:

答案 0 :(得分:3)

如果您要在最后一行切换操作顺序,您将得到您正在寻找的整数答案(9,如果我的计算是正确的)

D = (I * C) / 65535
/* D == 9 */

这是你正在寻找的答案吗?

答案 1 :(得分:0)

假设这些是你一直用于此计算的值,那么我会做类似的事情:

 D = I / (65535 / C);

 D = I / 4369;

因为C是65535的因子。这将有助于减少超出可用整数范围的可能性(即,如果你只有16位无符号整数)。

在更一般的情况下,如果您认为存在I和C的乘法将导致超出您正在使用的整数类型的允许范围内的值的风险(即使最终结果将在范围)你可以将分子和分母的GCD分解为:

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函数)。保留我们所认为的“十进制”部分中包含的信息的唯一方法是通过可以从模数得出的余数。我强烈建议你不要混淆这些不同数字系统的含义。整数只是整数。如果你需要它们是浮点数,你应该使用浮点数,而不是整数。如果你有兴趣做的就是向用户显示小数部分(即你没有真正用它来进行进一步的计算),那么你可以编写一个例程来将余数转换成代表余数的字符串。

答案 2 :(得分:0)

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

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