Perl 如何计算浮点数的div和mod?

Perl 如何计算浮点数的div和mod?,perl,math,floating-point,division,modulo,Perl,Math,Floating Point,Division,Modulo,在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

在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 );
给予


现在你可以看到,我已经为计算
div
mod
提出了一个“解决方案”。然而,我不明白的是,每个参数的符号对结果应该有什么影响。
div
是否总是正的,因为
n2
适合
n1
的次数?在这种情况下,算法应该如何工作?

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

例如:

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

所以余数是3或3−2.

有关更多信息:


此外,mod/div中出现负数时的输出取决于软件语言的实现。请看(看右边的表格)

标题问了一个问题,正文问了另一个问题。为了回答标题问题,就像在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 );
给予


fmod,嗯?我被纠正了。非常感谢您指出这一点。有人知道另一种方法吗,
fmod(-23,10)
返回
7
而不是
-3
?如果小于0,就加10?@ysth:这就是我最后做的,但是如果某个地方有一个模块已经做到了这一点,那就太好了,这样我就不必在代码中包含太多的帮助函数。
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