C ++ Sgn函数

时间:2011-01-15 04:01:58

标签: c++

我看到下面的函数应该返回双d的符号。但我无法理解它是如何工作的?

int sgn(double d){ 
    return d<-eps?-1:d>eps;
}

5 个答案:

答案 0 :(得分:7)

return d<-eps?-1:d>eps;

这意味着:

  • 如果d小于-eps,则结果为“否定”
  • 如果d超过eps,则结果为“正”(d>eps返回1)
  • 否则我们返回0(表示数字为“零”)

eps通常是一个小数字,因此我们将-1e-5和1e-5之间的数字视为“几乎为零”。这种方法用于淡化计算机浮点数的一些缺陷,如sin(pi)!=0。然而,它的代价是在计算中引入任意数eps,并失去例如。如果ab为正数,则a*b为正,前提是不会发生下溢。

答案 1 :(得分:4)

我怀疑eps是一个非常小的数字,大约0.0000000001。如果是这样,该函数使用三元符号来缩写形式:

int sgn(double d){   if(d&lt; -eps){     返回-1;   } else {     返回d&gt; EPS;   } }

如果d == 0.0,那么“返回d&gt; eps”部分可能会使其返回0。请记住,像“a&gt; b”这样的表达式会返回布尔值,如果为true则变为1,如果为false则变为0。

因此该函数实际上可以返回三个值中的一个:如果数字为负则为-1,如果为零则为0,如果为正则为1。

答案 2 :(得分:2)

浮点运算具有一些特性,如“machine epsilon”和-0值。此解决方案使用机器epsilon通过使用此机器epsilon确定此“-0”情况,但不完全正确:-0 = +0 = 0,始终,您不必检查它。此外,您的来源中未定义此eps:我猜它已在其他地方定义。

int sgn(double d){
    return d<0? -1 : d>0; # -1, 0, +1. FIXED
    }
更简单,是吧? :) d<0 return -1。否则,d>0会给出0或1,例如d>0? 1: 0

P.S。通常你不检查浮点数是否相等:它们不准确,20.6 突然(可预测,实际上)变为20.000000000001。但是,double精度非常高,值接近于零。

答案 3 :(得分:1)

我认为eps是一个非常小的值,非常接近0。

sgn函数返回-1是值低于-eps,如果值在[-eps,eps]则为0,如果值大于eps则为1。

答案 4 :(得分:0)

eps通常是一个非常小的值(希腊字母epsilon在数学中用于小增量)

所以这表示如果d小于eps(例如0.00000001)则返回-1,否则如果大于0则返回1,如果小于0则返回0