首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如果Perl已经链接到libm,为什么没有向用户公开任何函数?

如果Perl已经链接到libm,为什么没有向用户公开任何函数?
EN

Stack Overflow用户
提问于 2021-05-22 04:49:00
回答 1查看 299关注 0票数 1

Perl已经链接到libm

代码语言:javascript
复制
$ ldd $(which perl)
    ...
    libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fd8ce2ea000)
    ...

那么,如果Perl已经链接到libm,为什么不经常使用像ceilfloorpow这样的特性作为CORE::GLOBAL提供,或者在另一个名称空间中提供?为什么perldoc -q ceil会将POSIX.pm作为此函数的来源,为什么Math::Libm会存在?

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

EN

回答 1

Stack Overflow用户

发布于 2021-05-23 05:16:23

Perl确实内置了数学函数:只是它对您可能需要的函数的想法与20世纪70年代的小型机不相上下。我能找到的都有:

代码语言:javascript
复制
#!/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;

结果是:

代码语言:javascript
复制
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 )来完成。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67643693

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档