Perl已经链接到libm。
$ ldd $(which perl)
...
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fd8ce2ea000)
...那么,如果Perl已经链接到libm,为什么不经常使用像ceil、floor和pow这样的特性作为CORE::GLOBAL提供,或者在另一个名称空间中提供?为什么perldoc -q ceil会将POSIX.pm作为此函数的来源,为什么Math::Libm会存在?
Python还链接到libm,当您使用模块math中提供的符号运行import math时,它将向用户公开,并且可以从外部引用,如math.ceil(num)
发布于 2021-05-23 05:16:23
Perl确实内置了数学函数:只是它对您可能需要的函数的想法与20世纪70年代的小型机不相上下。我能找到的都有:
#!/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注意,Perl没有使用pow()函数,而是使用了**运算符,就像FORTRAN一样。你不会得到一个tan()函数,因为那是sin($x)/cos($x)。如果你需要其他超越函数,这就是为什么他们在所有好的编程书籍中都放了trigonometric functions table (PDF,p.39)。
我不记得自己曾经使用过或者需要过ceil()或floor(),但是sgn()作为一个内置的东西每次都让我抓狂。由于Perl本质上是一种无类型的脚本语言,因此数值园艺任务(如舍入)已经可以使用字符串函数(如sprintf "%.f", $val )来完成。
https://stackoverflow.com/questions/67643693
复制相似问题