1

Perl 已经链接到libm.

$ ldd $(which perl)
    ...
    libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fd8ce2ea000)
    ...

因此,如果 Perl 已经链接到libm,为什么不经常使用诸如ceil、和 s 之类的功能floorpow提供为CORE::GLOBALs 或在另一个命名空间中提供?为什么perldoc -q ceil将指向POSIX.pm作为这个函数的来源,为什么Math::Libm甚至存在?

当您使用模块中可用的符号运行时, Python 还链接到libm向用户公开的链接,并且可以从外部引用,例如import mathmathmath.ceil(num)

4

1 回答 1

0

Perl确实内置了数学函数:只是它对您可能需要的函数的想法与 1970 年代的小型计算机相当。我能找到的都有:

#!/usr/bin/env perl
# maths_builtins.pl - some (all?) of the libm functions built in to Perl
# scruss - 2021-05

my $val = -1.234;

print 'abs(', $val, ')', "\t=  ", abs($val), "\n";

my $pi = 4 * atan2( 1, 1 );
print '4*atan2(1,1)', "\t=  ", $pi, "\t(= π)", "\n";
print 'cos(π/6)', "\t=  ", cos( $pi / 6 ), "\n";

my $e = exp(1);
print 'exp(1)', "\t\t=  ", $e, "\t(= e)", "\n";
print 'int(', $val, ')', "\t= ", int($val), "\n";
print 'log(e)', "\t\t=  ", log($e), "\n";
print 'sin(π/6)', "\t=  ", sin( $pi / 6 ), "\n";
print 'sqrt(3)/2', "\t=  ", sqrt(3) / 2, "\n";
print 'sqrt(3)**2', "\t=  ", sqrt(3)**2, "\n";
exit;

导致:

abs(-1.234)     =  1.234
4*atan2(1,1)    =  3.14159265358979     (= π)
cos(π/6)        =  0.866025403784439
exp(1)          =  2.71828182845905     (= e)
int(-1.234)     = -1
log(e)          =  1
sin(π/6)        =  0.5
sqrt(3)/2       =  0.866025403784439
sqrt(3)**2      =  3

请注意pow(),Perl 没有函数,而是有**运算符,就像 FORTRAN 一样。你没有得到一个tan()函数,因为那是sin($x)/cos($x). 如果您需要其他超越函数,这就是他们将三角函数表(PDF,第 39 页)放在所有优秀编程书籍中的原因。

我不记得曾经使用过或需要过ceil()floor()自己,但是 Perlsgn()作为内置程序的缺失每次都让我受益匪浅。由于 Perl 本质上是一种无类型脚本语言,因此可以使用字符串函数(如sprintf "%.f", $val.

于 2021-05-22T21:16:22.990 回答