2009-01-30 15 views
11

Trong Perl, toán tử % dường như giả định các số nguyên. Ví dụ:Làm thế nào để bạn tính toán div và mod của số dấu chấm động?

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); 

cho

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 

Bây giờ như bạn có thể thấy, tôi đã đưa ra một "giải pháp" đã tính divmod. Tuy nhiên, những gì tôi không hiểu là những gì có hiệu lực các dấu hiệu của mỗi đối số nên có trên kết quả. Không phải div luôn là số dương, là số lần n2 phù hợp với n1? Làm thế nào số học phải làm việc trong tình huống này?

Trả lời

8

Cho a = qd + r, có sự mơ hồ khi tính phần còn lại cho các giá trị âm của d.

ví dụ .:

Khái niệm −42 ÷ −5, có thể được diễn tả như một trong hai như: −42 = 9×(−5) + 3 hoặc −42 = 8×(−5) + (−2).

Vì vậy, phần còn lại sau đó là 3 hoặc −2.

Để biết thêm thông: Wikipedia:Remainder "Inequality satisfied by the remainder"

Ngoài ra, đầu ra trong trường hợp số âm trong mod/div là thực hiện phụ thuộc vào ngôn ngữ phần mềm. Xem Wikipedia: Modulo operation (xem bảng bên phải)

+0

Đối với nền toán học, xem [mô-đun số học] (http://www.math.rutgers.edu/~erowland/modulararithmetic.html) và/hoặc [trừu tượng (hoặc đại số) đại số (http://www.millersville.edu/~bikenaga/abstract-algebra-1/modular-arithmetic/modular-arithmetic.html). – mctylr

15

Tiêu đề đặt một câu hỏi, một phần khác. Để trả lời câu hỏi tiêu đề, giống như trong C, toán tử% là một mô đun số nguyên, nhưng có một thường trình thư viện "fmod" là một mô đun điểm động.

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); 

cho

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, eh? Tôi đứng sửa. Cảm ơn rất nhiều vì đã chỉ ra điều đó. – bugmagnet

+0

Có ai biết thay thế sao cho 'fmod (-23, 10)' trả về '7' thay vì' -3'? – Flimm

+0

chỉ cần thêm 10 nếu nó nhỏ hơn 0? – ysth