Perl 未从除法运算符获取十进制值
我已经为函数e^x=1+x/1!编写了一个perl代码x^2/2!+x^3/3!+…+x^n/n 考虑x=1和n=10的值。我的问题是,我得到了分子和分母部分的正确值,但同时将它们划分为$factor。我没有得到十进制值。你能纠正我哪里出错吗Perl 未从除法运算符获取十进制值,perl,Perl,我已经为函数e^x=1+x/1!编写了一个perl代码x^2/2!+x^3/3!+…+x^n/n 考虑x=1和n=10的值。我的问题是,我得到了分子和分母部分的正确值,但同时将它们划分为$factor。我没有得到十进制值。你能纠正我哪里出错吗 ($x, $n) = @ARGV; # for x=1 , n =10 say "\n Your entered values are ", $x, " ", $n; for my $i (1..$n) { $numerator = $x**$i; $
($x, $n) = @ARGV; # for x=1 , n =10
say "\n Your entered values are ", $x, " ", $n;
for my $i (1..$n)
{
$numerator = $x**$i;
$denominator = Math::BigInt->new($i)->bfac();
$factor = int($numerator / $denominator); # tried it without typecasting then too noluck
$exp = $exp + $factor; #[$numerator/$denominator];
say $i, "\n Numerator :", $numerator, "Denominator :", $denominator, " Factor :", $factor, " EXP :", $exp;
$i++;
}
好吧,你是故意使用
int()
。小数点后的东西都扔掉了。拿走int()
,你应该会没事的
$numerator = 1;
$denominator = 2;
$factor = $numerator / $denominator;
print $factor;
为我打印0.5
EDIT:这有点麻烦,但我发现了真正的问题--Math::BigInt
总是进行整数除法,不管你对另一个操作符做什么。您可以通过执行以下操作来解决此问题:
use Math::BigFloat;
[...]
$denominator = Math::BigFloat->new(Math::BigInt->new($i)->bfac());
好吧,你是故意使用
int()
。小数点后的东西都扔掉了。拿走int()
,你应该会没事的
$numerator = 1;
$denominator = 2;
$factor = $numerator / $denominator;
print $factor;
为我打印0.5
EDIT:这有点麻烦,但我发现了真正的问题--Math::BigInt
总是进行整数除法,不管你对另一个操作符做什么。您可以通过执行以下操作来解决此问题:
use Math::BigFloat;
[...]
$denominator = Math::BigFloat->new(Math::BigInt->new($i)->bfac());
问题是分母是一个
Math::BigInt
。整数除以其中一个总是得到整数结果。如果改用Math::BigFloat,它将起作用。或者,如果您想要精确的有理数,请使用Math::BigRat。问题是您的分母是一个Math::BigInt
。整数除以其中一个总是得到整数结果。如果改用Math::BigFloat,它将起作用。或者,如果您想要精确的有理数,请使用Math::BigRat。这对我使用bignum
很有效
#!/usr/bin/perl
use strict;
use warnings;
use 5.014;
use bignum;
my ($x, $n) = @ARGV; # for x=1 , n =10
say "\n Your entered values are ", $x, " ", $n;
my $exp;
for my $i (1..$n)
{
my $numerator = $x**$i;
my $denominator = Math::BigInt->new($i)->bfac();
my $factor = $numerator / $denominator; # tried it without typecasting then too noluck
$exp += $factor; #[$numerator/$denominator];
say $i, "\n Numerator : ", $numerator, " Denominator :", $denominator, " Factor :", $factor, " EXP :", $exp;
}
产出为:
C:\Old_Data\perlp>perl t7.pl 1 10
Your entered values are 1 10
1
Numerator : 1 Denominator :1 Factor :1 EXP :1
2
Numerator : 1 Denominator :2 Factor :0.5 EXP :1.5
3
Numerator : 1 Denominator :6 Factor :0.1666666666666666666666666666666666666667 EXP :1.6666666666666666666666666666666666666667
4
Numerator : 1 Denominator :24 Factor :0.04166666666666666666666666666666666666667 EXP :1.70833333333333333333333333333333333333337
5
Numerator : 1 Denominator :120 Factor :0.008333333333333333333333333333333333333333 EXP :1.716666666666666666666666666666666666666703
6
Numerator : 1 Denominator :720 Factor :0.001388888888888888888888888888888888888889 EXP :1.718055555555555555555555555555555555555592
7
Numerator : 1 Denominator :5040 Factor :0.0001984126984126984126984126984126984126984 EXP :1.7182539682539682539682539682539682539682904
8
Numerator : 1 Denominator :40320 Factor :0.0000248015873015873015873015873015873015873 EXP :1.7182787698412698412698412698412698412698777
9
Numerator : 1 Denominator :362880 Factor :0.000002755731922398589065255731922398589065256 EXP :1.718281525573192239858906525573192239858942956
10
Numerator : 1 Denominator :3628800 Factor :0.0000002755731922398589065255731922398589065256 EXP :1.7182818011463844797178130511463844797178494816
这对我使用
bignum
有效
#!/usr/bin/perl
use strict;
use warnings;
use 5.014;
use bignum;
my ($x, $n) = @ARGV; # for x=1 , n =10
say "\n Your entered values are ", $x, " ", $n;
my $exp;
for my $i (1..$n)
{
my $numerator = $x**$i;
my $denominator = Math::BigInt->new($i)->bfac();
my $factor = $numerator / $denominator; # tried it without typecasting then too noluck
$exp += $factor; #[$numerator/$denominator];
say $i, "\n Numerator : ", $numerator, " Denominator :", $denominator, " Factor :", $factor, " EXP :", $exp;
}
产出为:
C:\Old_Data\perlp>perl t7.pl 1 10
Your entered values are 1 10
1
Numerator : 1 Denominator :1 Factor :1 EXP :1
2
Numerator : 1 Denominator :2 Factor :0.5 EXP :1.5
3
Numerator : 1 Denominator :6 Factor :0.1666666666666666666666666666666666666667 EXP :1.6666666666666666666666666666666666666667
4
Numerator : 1 Denominator :24 Factor :0.04166666666666666666666666666666666666667 EXP :1.70833333333333333333333333333333333333337
5
Numerator : 1 Denominator :120 Factor :0.008333333333333333333333333333333333333333 EXP :1.716666666666666666666666666666666666666703
6
Numerator : 1 Denominator :720 Factor :0.001388888888888888888888888888888888888889 EXP :1.718055555555555555555555555555555555555592
7
Numerator : 1 Denominator :5040 Factor :0.0001984126984126984126984126984126984126984 EXP :1.7182539682539682539682539682539682539682904
8
Numerator : 1 Denominator :40320 Factor :0.0000248015873015873015873015873015873015873 EXP :1.7182787698412698412698412698412698412698777
9
Numerator : 1 Denominator :362880 Factor :0.000002755731922398589065255731922398589065256 EXP :1.718281525573192239858906525573192239858942956
10
Numerator : 1 Denominator :3628800 Factor :0.0000002755731922398589065255731922398589065256 EXP :1.7182818011463844797178130511463844797178494816
我试着去掉了一部分。它仍然是相同的$factor显示值0,即使对于1/2,即使我单独尝试了相同的表达式,结果都很好。但在被问到的情况下,如果
$denominor
是int,那么这将起作用,但它不是int;这是一个Math::BigInt
。我试着去掉int部分。它仍然是相同的$factor显示值0,即使对于1/2,即使我单独尝试了相同的表达式,结果都很好。但在被问到的情况下,如果$denominor
是int,那么这将起作用,但它不是int;这是一个Math::BigInt
。