我看到下面的函数应该返回双d的符号。但我无法理解它是如何工作的?
int sgn(double d){
return d<-eps?-1:d>eps;
}
答案 0 :(得分:7)
return d<-eps?-1:d>eps;
这意味着:
d
小于-eps
,则结果为“否定”d
超过eps
,则结果为“正”(d>eps
返回1) eps
通常是一个小数字,因此我们将-1e-5和1e-5之间的数字视为“几乎为零”。这种方法用于淡化计算机浮点数的一些缺陷,如sin(pi)!=0
。然而,它的代价是在计算中引入任意数eps
,并失去例如。如果a
和b
为正数,则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