数学函数

目录

  • abs — 绝对值
  • acos — 反余弦
  • acosh — 反双曲余弦
  • asin — 反正弦
  • asinh — 反双曲正弦
  • atan — 反正切
  • atan2 — 两个变量的反正切
  • atanh — 反双曲正切
  • base_convert — 在任意进制之间转换数字
  • bindec — 二进制转十进制
  • ceil — 向上取整
  • cos — 余弦
  • cosh — 双曲余弦
  • decbin — 十进制转二进制
  • dechex — 十进制转十六进制
  • decoct — 十进制转八进制
  • deg2rad — 将度数转换为弧度
  • exp — 计算 e 的指数
  • expm1 — 返回 exp($num) - 1,以一种即使 number 值接近零时也准确的方式计算
  • fdiv — 按照 IEEE 754 标准,对两个数字进行除法
  • floor — 向下取整
  • fmod — 返回参数除法的浮点余数(模数)
  • hexdec — 十六进制转十进制
  • hypot — 计算直角三角形的斜边长度
  • intdiv — 整数除法
  • is_finite — 检查浮点数是否为有限
  • is_infinite — 检查浮点数是否为无限
  • is_nan — 检查浮点数是否为 NAN
  • log — 自然对数
  • log10 — 以 10 为底的对数
  • log1p — 返回 log(1 + number),以一种即使 number 值接近零时也准确的方式计算
  • max — 查找最高值
  • min — 查找最低值
  • octdec — 八进制转十进制
  • pi — 获取圆周率的值
  • pow — 指数表达式
  • rad2deg — 将弧度转换为度数
  • round — 对浮点数进行四舍五入
  • sin — 正弦
  • sinh — 双曲正弦
  • sqrt — 平方根
  • tan — 正切
  • tanh — 双曲正切
添加笔记

用户贡献笔记 35 笔记

pat.mat AT sympatico DOT com
20 年前
对于对微分方程感兴趣的人,我写了一个函数,它接收像这样的一串字符串:x^2+x^3 并将其转换为
2x+3x^2,这是前面方程的微分。

在代码中,只有一件事缺失:$string{$i} 经常超出边界(未初始化的字符串偏移量:6 在...中)
如果你的错误设置设置得太高了...我只是不知道如何解决这个问题。

所以,这里是对微分方程(只有 + 和 -)的代码

<?
function differentiel($equa)
{
$equa = strtolower($equa);
echo "Equation de depart: ".$equa."<br>";
$final = "";

for($i = 0; $i < strlen($equa); $i++)
{
//从接收到的 $equa 中创建一个新的字符串
if($equa{$i} == "x" && $equa{$i+1} == "^")
{
$final .= $equa{$i+2};
$final .= "x^";
$final .= $equa{$i+2}-1;
}
elseif($equa{$i} == "+" || $equa{$i} == "-")
{
$final .= $equa{$i};
}
elseif(is_numeric($equa{$i}) && $i == 0)
{
//处理括号和其他一般项 + 处理 ^ 后面的内容:2^2
$final .= $equa{$i}."*";
}
elseif(is_numeric($equa{$i}) && $i > 0 && $equa{$i-1} != "^")
{
//处理 ^ 后面的内容:2^2
$final .= $equa{$i}."*";
}
elseif($equa{$i} == "^")
{
continue;
}
elseif(is_numeric($equa{$i}) && $equa{$i-1} == "^")
{
continue;
}
else
{
if($equa{$i} == "x")
{
$final .= 1;
}
else
{
$final .= $equa{$i};
}
}
}
//
//在之前的字符串 $final 中管理乘法添加
//
$finalMul = "";
for($i = 0; $i < strlen($final); $i++)
{
if(is_numeric($final{$i}) && $final{$i+1} == "*" && is_numeric($final{$i+2}))
{
$finalMul .= $final{$i}*$final{$i+2};
}
elseif($final{$i} == "*")
{
continue;
}
elseif(is_numeric($final{$i}) && $final{$i+1} != "*" && $final{$i-1} == "*")
{
continue;
}
else
{
$finalMul .= $final{$i};
}
}
echo "equa final: ".$finalMul;
}
?>

我知道这不是最优的,但我很快就做完了 :)
如果你有任何意见,请给我发邮件。
我还想在 C 中完成这个函数,以便很快将其添加到 phpCore ...
Patoff
daniel at g-loc dot org
18 年前
如果你是一名飞行员,需要计算风偏角和地面速度(例如在航线规划期间),这将非常有用。

$windcorrection = rad2deg(asin((($windspeed * (sin(deg2rad($tt - ($winddirection-180))))/$tas))));
$groundspeed = $tas*cos(deg2rad($windcorrection)) + $windspeed*cos(deg2rad($tt-($winddirection-180)));

你可能可以写得更漂亮,但它们能用!
lummox
16 年前
下面这个函数不比前面评论中的那个函数更容易,做相同的事情吗?

function trimInteger($targetNumber,$newLength) {
return $targetNumber%pow(10,$newLength);
}
info at gavinvincent dot co dot uk
19 年前
如果你需要处理极坐标,那么在大多数情况下,你需要将它转换为 x,y 进行输入和输出:这里有一些函数可以将笛卡尔坐标转换为极坐标,以及将极坐标转换为笛卡尔坐标
<?
//返回 r、theta 的数组,范围为 0-2*pi(以弧度表示)
function rect2polar($x,$y)
{
if(is_numeric($x)&&is_numeric($y))
{
$r=sqrt(pow($x,2)+pow($y,2));
if($x==0)
{
if($y>0) $theta=pi()/2;
else $theta=3*pi()/2;
}
else if($x<0) $theta=atan($y/$x)+pi();
else if($y<0) $theta=atan($y/$x)+2*pi();
else $theta=atan($y/$x);
$polar=array("r"=>$r,"theta"=>$theta);
return $polar;
}
else return false;
}

//r 必须以弧度表示,返回 x、y 的数组
function polar2rect($r,$theta)
{
if(is_numeric($r)&&is_numeric($theta))
{
$x=$r*cos($theta);
$y=$r*sin($theta);
$rect=array("x"=>$x,"y"=>$y);
}
else
{
return false;
}
}
?>
匿名
6 年前
我需要阶乘函数的原因是因为 PHP 本身也没有 nPr 或 nCr 函数。

function n_pick_r($n,$r){$n=(int)$n; $r=(int)$r;return (fact($n)/fact($n-$r));}
function n_choose_r($n,$r){$n=(int)$n; $r=(int)$r;return (n_pick_r($n,$r)/fact($r));}

希望这对某人有所帮助!
示例:https://vb.3dlat.com/
php at keith tyler dot com
13 年前
另一种序数方法,不需要使用日期函数

<?php
sprintf
( "%d%s", $t, array_pop( array_slice( array_merge( array( "th","st","nd","rd"), array_fill( 4,6,"th")), $t%10, 1)));'
?>
Mike
16 年前
//上一个帖子中有一个错误,这是更正后的版本

/*
只是一个简单的函数,用于从整数的左侧修剪数字。修剪到 4 位->(例如 987654 => 7654)
*/

function trimInteger($targetNumber,$newLength) {

$digits = pow(10,$newLength);

$s = ($targetNumber/ $digits); //使最后 X 位数字成为小数部分

$t = floor($targetNumber / $digits); //去掉最后 X 位数字(小数部分)

$h = $s - $t; //只保留小数部分

$newInteger = ($h*$digits); //使小数点后的所有内容成为新数字

return $newInteger;
}
florian at shellfire dot de
20 年前
请注意,短并不总是更好
(意思是上面的阶乘实现真的太短了)。

在我看来,一个更清晰的代码方式是,包括一个检查
负数或非整数的值。

为了计算一个正整数的阶乘,
一种迭代的方式(可能更难理解)
通常会快一点,但我只把它用在小
值上,所以对我来说并不重要

<?php

// 计算正整数的阶乘
function iFaculty($a_iFac)
{
if (
$a_iFac > 0)
{
return
$a_iFac * $this->iFaculty($a_iFac - 1);
}
elseif (
$a_iFac == 0)
{
return
1;
}
else
{
return
0; // 错误参数!
}
}
?>

我还写了另一个函数来计算
两个值的二项式系数,我还没有在任何地方找到它,所以我希望它能帮到某些人(与上面提到的阶乘函数配合良好,可以在你自己的类中使用!)

<?php

// 计算两个正整数的二项式系数“n over k”
// 对于 n >= k
function iBinCoeff($a_iN, $a_iK)
{
// 二项式系数定义为 n! / [ (n-k)! * k! ]
return $this->iFaculty($a_iN) / ($this->iFaculty($a_iN - $a_iK) * $this->iFaculty($a_iK));
}

?>
edward at edwardsun dot com
18 年前
好吧,只是一个说明.. 也许我有点笨.. 但请记住使用 pow() 而不是 "^" 符号来表示指数.. 因为我花了 5 分钟才弄明白为什么它没有工作。
moikboy (nospam!) moikboy (nospam!) hu
18 年前
我认为,这是计算阶乘的最佳代码

<?php
function fact($int){
if(
$int<2)return 1;
for(
$f=2;$int-1>1;$f*=$int--);
return
$f;
};
?>

还有一个用来计算第 $int 个斐波那契数的

<?php
function fib($int){
static
$fibTable=array();
return empty(
$fibTable[$int])?$fibTable[$int] = $int>1?fib($int-2)+fib($int-1):1:$fibTable[$int];
};
?>
Chronial "at" cyberpunkuniverse.de
20 年前
这里有 nPr 和 nPc 函数
(必须定义 NaN - 不知道,如何以“正确”的方式这样做)

<?php
define
(NaN,acos(1.01));

function
nCr($n,$r){
if (
$r > $n)
return
NaN;
if ((
$n-$r) < $r)
return
nCr($n,($n-$r));
$return = 1;
for (
$i=0;$i < $r;$i++){
$return *= ($n-$i)/($i+1);
}
return
$return;
}

function
nPr($n,$r){
if (
$r > $n)
return
NaN;
if (
$r)
return
$n*(nPr($n-1,$r-1));
else
return
1;
}
?>
AsherMaximum gmail
13 年前
这里有一个简单的方法可以将数字转换为序数,是我创建的

$i == 要转换的数字。如果你需要填充一个数组,把它放到一个 for 循环中。

<?php
// 将增量变量更改为序数。
$n1 = $i % 100; // 首先删除除了最后两位数以外的所有数字

$n2 = ($n1 < 20 ? $1 : $i % 10; // 除非数字在十位数内,否则删除除了最后一位数以外的所有数字,所有数字都应该是 'th'

//$n 现在用于确定后缀。
$ord = ($n2==1 ? $i.'st' : ( ($n2==2 ? $i.'nd' : ($n2==3 ? $i.'rd' : $i.'th') ) ) )
?>
help at gjbdesign dot com
19 年前
有时用户必须在表单中输入一个数字。此函数将分数转换为小数,并将小数保留。当然,你可能希望对最终输出进行四舍五入,但这在这里没有包括。

<?php
/*一些 $q 的示例值
$q = "2.5";
$q = "2 1/2";
$q = "5/2";
*/
function Deci_Con($q){
// 检查是否有空格,表示带分数的整数
if(strstr($q, ' ')){
$wa = strrev($q);
$wb = strrev(strstr($wa, ' '));
$whole = true;// 这是一个整数
}
// 现在检查分数部分
if(strstr($q, '/')){
if(
$whole==true){// 如果是整数,则从计算中删除整数和空格
$q = strstr($q, ' ');
}
$b = str_replace("/","",strstr($q, '/'));// 这是除数
// 分离分子
$c = strrev($q);
$d = strstr($c, '/');
$e = strrev($d);
$a = str_replace("/","",$e);// 几乎最终的分子
if($whole==true){// 将整数添加到计算中
$a = $a+($wb*$b);// 新分子是整数乘以分母加上原始分子
}
$q = $a/$b;// 现在就是你的小数
return $q;
}else{
return
$q;// 不是分数,直接返回小数
}
}
?>
capripot at gmail dot com
12 年前
另一个更简单的函数来使用 luhn 算法检查数字

<?php
function luhn($num){
if(!
$num)
return
false;
$num = array_reverse(str_split($num));
$add = 0;
foreach(
$num as $k => $v){
if(
$k%2)
$v = $v*2;
$add += ($v >= 10 ? $v - 9 : $v);
}
return (
$add%10 == 0);
}
?>

不知道 foreach 和数组操作是否比 while 和 substr 更快,但我感觉它更清晰。
peter-stangl at t-online dot de
18 年前
我需要近似一个积分,因为我无法计算它,所以我写了这个函数。它使用复合辛普森规则近似积分。
有关辛普森规则的更多信息:http://en.wikipedia.org/wiki/Simpson%27s_rule

<?php

function simpsonf($x){
// 使用复合辛普森规则返回用于积分近似的 f(x)
return(pow((1+pow($x, (-4))), 0.5));
}
function
simpsonsrule($a, $b, $n){
// 使用具有 $n 个区间的复合辛普森规则近似 integral_a_b f(x) dx
// $n 必须是偶数
// f(x) 在 "function simpsonf($x)" 中定义
if($n%2==0){
$h=($b-$a)/$n;
$S=simpsonf($a)+simpsonf($b);
$i=1;
while(
$i <= ($n-1)){
$xi=$a+$h*$i;
if(
$i%2==0){
$S=$S+2*simpsonf($xi);
}
else{
$S=$S+4*simpsonf($xi);
}
$i++;
}
return(
$h/3*$S);
}
else{
return(
'$n has to be an even number');
}
}

?>
jbeardsl [found_at] gte [d0t] net
21 年前
我正在寻找一个截断函数。找不到,我就自己写了一个。由于它将所有内容都视为数字,所以我认为它比使用字符串函数更快。希望对您有所帮助…

<?php
function truncate ($num, $digits = 0) {

// 提供实数和小数点后要保留的位数。

$shift = pow(10, $digits);
return ((
floor($num * $shift)) / $shift);
}
?>
patience at worldonline dot nl
22 年前
上面给出的阶乘示例是错误的。这里有一个正确的版本,这样您就不必重新发明轮子了…

<?php
function mathFact( $s )
{
$r = (int) $s;

if (
$r < 2 )
$r = 1;
else {
for (
$i = $r-1; $i > 1; $i-- )
$r = $r * $i;
}

return(
$r );
}
?>
nazgul26 (at_sign) windfox dot net
21 年前
此代码将十进制数转换为等效的分数。可以通过更改 PRECISION 来设置精度。

<?php
define
(PRECISION, .01);

$count=0;
$result=array();
decimalToFraction($_REQUEST['dec'],$count,&$result);
$count = count($result);
$simp_fract = simplifyFraction($result,$count,1,$result[$count]);

echo
$simpl_fract;

// 函数开始

/*
将十进制数转换为数组中表示的未简化分数
*/
function decimalToFraction($decimal,$count,$result) {
$a = (1/$decimal);
$b = ( $a - floor($a) );
$count++;
if (
$b > .01 && $count <= 5) decimalToFraction($b,$count,&$result);
$result[$count] = floor($a);
}

/*
简化从 decimalToFraction 返回的数组形式的分数
*/
function simplifyFraction($fraction,$count,$top,$bottom) {
$next = $fraction[$count-1];
$a = ($bottom * $next) + $top;
$top = $bottom;
$bottom = $a;
$count--;
if (
$count > 0) simplifyFraction($fraction,$count,$top,$bottom);
else {
return
"<font size=1>$bottom/$top</font>";
}
}
?>
webkid%webkid.com
22 年前
我需要阶乘函数的原因是因为 PHP 本身也没有 nPr 或 nCr 函数。

function n_pick_r($n,$r){$n=(int)$n; $r=(int)$r;return (fact($n)/fact($n-$r));}
function n_choose_r($n,$r){$n=(int)$n; $r=(int)$r;return (n_pick_r($n,$r)/fact($r));}

希望这对某人有所帮助!
jl85 at yahoo dot com
20 年前
这是另一个最大公约数 (gcd) 函数,一个非常小的函数。

function gcd($n,$m){
if(!$m)return$n;return gcd($m,$n%$m);
}

它是通过递归实现的。不确定它的速度,但它真的很小!不过,这对于浮点数来说并不准确。如果您想要一个浮点数,您需要至少使用 PHP 4,代码将是

function gcd($n,$m){
if(!$m)return$n;return gcd($m,fmod($n,$m));
}
bjcffnet at gmail dot com
19 年前
thearbitcouncil at gmail dot com,您只需使用 array_sum()
<?php
function average($arr)
{
if (!
is_array($arr)) return false;

return
array_sum($arr)/count($arr);
}

$array = array(5, 10, 15);
echo
average($array); // 10
?>
ian at mp3 dot com
23 年前
对于那些正在寻找信用卡验证功能的人,我写了一个简单的 LUHN 公式算法。

<?php
$valid
= 1;

$numOfDigits = 0 - strlen($ccNumber);

$i = -1;
while (
$i>=$numOfDigits){
if ((
$i % 2) == 0){
$double = 2*(substr($ccNumber, $i, 1));
$total += substr($double,0,1);
if (
strlen($double > 1)){
$total += substr($double,1,1);
}
} else {
$total += substr($ccNumber, $i, 1);
}
$i--;
}

if ((
$total % 10) != 0){
$valid = 0;
}
?>
Florian
18 年前
一个模拟求和运算符的函数。(http://en.wikipedia.org/wiki/Sum)。注意表达式,因为它可能导致安全漏洞;注意单引号,不要解析“$”。
<?php
# @param string $expr 要计算的表达式(例如 (2*$x)^2+1)
# @param string $var 虚拟变量(例如 "x")
# @param integer $start
# @param integer $end
# @param integer $step

function sum($expr,$var,$start,$end,$step = 1) {
$expr = str_replace(';','',$expr);
$var = str_replace('$','',$var);
$start = (int)$start; $end = (int)$end; $step = (int)$step; $sum = 0;

for (
$i = $start; $i <= $end; $i = $i + $step) {
$_expr = str_replace('$'.$var,$i,$expr);
$_eval = '$_result = '.$_expr.'; return $_result;';
$_result = eval($_eval);
if(
$result === FALSE) return "SYNTAX ERROR : $expr";
$sum += $_result;
}
return (int)
$sum;
}
?>
tmpa at yahoo dot com
19 年前
虽然 joogat 的单行函数很短,但最好使用迭代的方式来计算阶乘,而不是递归的方式。请记住,如果你想要计算大的阶乘,你需要使用某种任意精度整数,或者使用 BCMath 函数。当然,除非你想要计算很大的数字(170! 是你能计算的不会返回无穷大的最大值),否则你可能不会注意到任何时间差异。
<?php
function factorial($in) {
// 0! = 1! = 1
$out = 1;

// 只有当 $in >= 2 时
for ($i = 2; $i <= $in; $i++) {
$out *= $i;
}

return
$out;
}
?>
jerry dot wilborn at fast dot net
21 年前
以下是在 PHP 中计算标准差的方法,其中 $samples 是一个递增数字键的数组,其值是你的样本

$sample_count = count($samples);

for ($current_sample = 0; $sample_count > $current_sample; ++$current_sample) $sample_square[$current_sample] = pow($samples[$current_sample], 2);

$standard_deviation = sqrt(array_sum($sample_square) / $sample_count - pow((array_sum($samples) / $sample_count), 2));
fabien_mornand at yahoo dot fr
20 年前
以下是一个计算一个数字的最大公约数的算法。这是我在数学课上学习的欧几里得算法。为了好玩,我把它用 PHP 实现了。

<?php
if($a && $b)
{
$ax=$a; $bx=$b;
$r=fmod($a,$b);
if(!
$r){$rx=$r;}
while(
$r){
$rx=$r;
$a=$b;
$b=$r;
$r=fmod($a,$b);
}
}
echo
'PGCD ('.$ax.' , '.$bx.' ) = '.$rx;
?>
jl85 at yahoo dot com
21 年前
还有另一种更快的判断奇偶数的方法,就是使用位运算符。别问我它是怎么工作的,我只是通过实验才发现的(编辑能解释一下吗?)。

if ((1&$num)) {
echo "$num 是奇数";
}

if (!(1&$num)) {
echo "$num 是偶数";
}

它的工作原理是 (1&$num) 对奇数返回 1,对偶数返回 0。
tembenite at gmail dot com
17 年前
为了补充 Cornelius 的内容,我写了一个函数,它将接收一个数字数组并返回它们的最小公倍数。

function lcm_arr($items){
// 输入:一个数字数组
// 输出:这些数字的最小公倍数
while(2 <= count($items)){
array_push($items, lcm(array_shift($items), array_shift($items)));
}
return reset($items);
}

// 他的代码在下面,添加了 $ 用于变量

function gcd($n, $m) {
$n=abs($n); $m=abs($m);
if ($n==0 and $m==0)
return 1; // 避免无限递归
if ($n==$m and $n>=1)
return $n;
return $m<$n?gcd($n-$m,$n):gcd($n,$m-$n);
}

function lcm($n, $m) {
return $m * ($n/gcd($n,$m));
}
thearbitcouncil at gmail dot com
19 年前
两个我在其他地方找不到的函数……一个用于计算数字数组的平均值,另一个用于计算样本的方差。两者都接收一个数字数组作为参数。没有太多错误检查或优化……

(注意:方差函数使用了平均值函数……)

<?php

function average($arr)
{
if (!
count($arr)) return 0;

$sum = 0;
for (
$i = 0; $i < count($arr); $i++)
{
$sum += $arr[$i];
}

return
$sum / count($arr);
}

function
variance($arr)
{
if (!
count($arr)) return 0;

$mean = average($arr);

$sos = 0; // Sum of squares
for ($i = 0; $i < count($arr); $i++)
{
$sos += ($arr[$i] - $mean) * ($arr[$i] - $mean);
}

return
$sos / (count($arr)-1); // denominator = n-1; i.e. estimating based on sample
// n-1 is also what MS Excel takes by default in the
// VAR function
}

echo
variance(array(4,6,23,15,18)); // echoes 64.7...correct value :)

?>
marasek.SPAMLESS at telton.de
18 年前
我忍不住要做一个更简单的序数函数版本。
<?php
function ordinal($num)
{
$num = (int)$num;
$digit = substr($num, -1, 1);
$ord = "th";
switch(
$digit)
{
case
1: $ord = "st"; break;
case
2: $ord = "nd"; break;
case
3: $ord = "rd"; break;
break;
}
return
$num.$ord;
}
?>
可以将类型转换替换为

<?php
if($num===NULL or $num==="")
{return
NULL;}
?>

如果 $num 为空,则获得空的结果,而不是 "0th"。
barry at megaspace dot com
17 年前
这是一个最小公倍数 (lcd) 函数

$array = array(3,4,6,8,18,2);

function lcd($array,$x) {

$mod_sum = 0;

for($int=1;$int < count($array);$int++) {
$modulus[$int] = ($array[0]*$x) % ($array[$int]);
$mod_sum = $mod_sum + $modulus[$int];
}

if (!$mod_sum) {
echo "LCD: ".($array[0]*$x)."\n";
}

else {
lcd($array,$x+1);
}

}

lcd($array,1);
Aiden880
9 年前
最小公倍数
function lcd($num, $start) {
while($num % $start != 0) {
$start++;
}
return $start;
}
jordanolsommer at imap dot cc
20 年前
位运算 AND ("&") 运算符能够用来判断一个数字是奇数还是偶数的原因在于,奇数的二进制表示总是具有最右边的 (2^0) 位 = 1,而偶数的二进制表示总是具有 2^0 位 = 0。

因此,如果你执行 "1 & $num",如果数字是偶数,它将返回零(因为 xxxxxxx0 [二进制的偶数] 和 00000001 [1] 不共享任何位),如果数字是奇数,它将返回 1(xxxxxx1 和 000001)。

这是一种巧妙的做法,但我想 $num % 2 也可以工作:)。
monte at ohrt dot com
18 年前
这是一个有效地计算二项式系数 C(n,k) 的方法。此代码源自 Owant: Mastering Algorithms with Perl。

<?php
// 计算二项式系数
function binomial_coeff($n, $k) {

$j = $res = 1;

if(
$k < 0 || $k > $n)
return
0;
if((
$n - $k) < $k)
$k = $n - $k;

while(
$j <= $k) {
$res *= $n--;
$res /= $j++;
}

return
$res;

}
?>

如果你使用 --enable-bcmath 编译了 php,你可以通过替换来获得极大数字的完整整数值

$res *= $n--;
$res /= $j++;



$res = bcmul($res, $n--);
$res = bcdiv($res, $j++);
pradhumansaini2 at gmail dot com
3 年前
阿贾伊·辛格·德奥尔(Ajay Singh Deol)俗称桑尼·德奥尔(Sunny Deol),是印度著名的电视演员兼政治家。如果你想了解更多信息,可以在浏览器中搜索 Sunny Deol age,在那里你可以获得他的完整信息。
供你参考,桑尼·德奥尔是获得过电影奖最佳男主角奖的人。
To Top