当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《你如何计算浮点数的div和mod?》经验,为你挑选了2个好方法。

在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总是积极的,是n2适合的次数n1?算术在这种情况下应该如何工作?



1> ysth..:

标题问一个问题,另一个问题.要回答标题问题,就像在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



2> Learning..:

给定a = qd + r,在计算负值的余数时存在模糊性d.

例如:

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

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

欲了解更多信息:维基百科:剩余"余下的不平等"

此外,mod/div中负数的情况下的输出是依赖于软件语言的实现.请参阅维基百科:Modulo操作(请查看右表)

推荐阅读
谢谢巷议
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有