2009-01-30 81 views
11

在Perl中,%運算符似乎假定爲整數。例如:你如何計算浮點數的div和mod?

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是不是總是正數,是n2適合於n1的次數?算術在這種情況下應該如何工作?

回答

8

鑑於a = qd + r,在計算d的負值的餘數時存在不明確性。

例如爲:

表達−42 ÷ −5,可以表示爲既可以作爲: −42 = 9×(−5) + 3−42 = 8×(−5) + (−2)

所以剩下的就是3或-2。

欲瞭解更多信息:Wikipedia:Remainder "Inequality satisfied by the remainder"

而且,在MOD/DIV負數的情況下,輸出是實現相關的軟件語言。見Wikipedia: Modulo operation(看右表)

+0

對於數學背景,參見[模運算(http://www.math.rutgers.edu/~erowland/modulararithmetic.html)和/或[摘要(或小學)代數](http://www.millersville.edu/~bikenaga/abstract-algebra-1/modular-arithmetic/modular-arithmetic.html)。 – mctylr 2014-07-24 18:47:52

15

標題問一個問題,身體另一個問題。爲了回答標題問題,就像在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 
+0

fmod,呃?我立場糾正。非常感謝您指出這一點。 – bugmagnet 2009-02-01 23:50:09