12

在 Perl 中,%运算符似乎假定为整数。例如:

sub foo {
    my $n1 = shift;
    my $n2 = shift;
    print "perl's mod=" . $n1 % $n2, "\n";
    my $res = $n1 / $n2;
    my $t = int($res);
    print "my div=$t", "\n";
    $res = $res - $t;
    $res = $res * $n2;
    print "my mod=" . $res . "\n\n";
}   

foo( 3044.952963, 7.1 );
foo( 3044.952963, -7.1 );
foo( -3044.952963, 7.1 );
foo( -3044.952963, -7.1 );

perl's mod=6
my div=428
my mod=6.15296300000033

perl's mod=-1
my div=-428
my mod=6.15296300000033

perl's mod=1
my div=-428
my mod=-6.15296300000033

perl's mod=-6
my div=428
my mod=-6.15296300000033

现在你可以看到,我已经想出了一个“解决方案”来计算divmod。但是,我不明白每个参数的符号应该对结果产生什么影响。不总是积极的,是适合div的次数吗?在这种情况下,算法应该如何工作?n2n1

4

2 回答 2

17

标题提出一个问题,正文提出另一个问题。要回答标题问题,就像在 C 中一样,% 运算符是一个整数模数,但是有一个库例程“fmod”它是一个浮点模数。

use POSIX "fmod";

sub foo {
    my $n1 = shift;
    my $n2 = shift;
    print "perl's fmod=" . fmod($n1,$n2), "\n";
    my $res = $n1 / $n2;
    my $t = int($res);
    print "my div=$t", "\n";
    $res = $res - $t;
    $res = $res * $n2;
    print "my mod=" . $res . "\n\n";
}

foo( 3044.952963, 7.1 );
foo( 3044.952963, -7.1 );
foo( -3044.952963, 7.1 );
foo( -3044.952963, -7.1 );

perl's fmod=6.15296300000033
my div=428
my mod=6.15296300000033

perl's fmod=6.15296300000033
my div=-428
my mod=6.15296300000033

perl's fmod=-6.15296300000033
my div=-428
my mod=-6.15296300000033

perl's fmod=-6.15296300000033
my div=428
my mod=-6.15296300000033
于 2009-02-01T09:47:33.657 回答
8

给定a = qd + r,在计算 的负值的余数时存在歧义d

例如:

表达式−42 ÷ −5, 可以表示为: −42 = 9×(−5) + 3−42 = 8×(−5) + (−2)

所以余数是 3 或 -2。

欲了解更多信息:维基百科:余数“余数满足的不等式”

此外,在 mod / div 中为负数时的输出取决于软件语言的实现。见维基百科:模运算(见右表)

于 2009-01-30T07:02:21.197 回答