在下面的代码中,我遇到了一个奇怪的现象。在线上运行时,if {$ma == $mb}
两者mb
都ma
相等1.0
,但未采用 if。当我将 to 更改==
为eq
or[cequal $ma $mb]
时, if 被采用。
此外,当我尝试使用1.0
(if {$ma == 1.0}
和if {$1.0 == $mb}
) 更改其中一个变量时,if 也没有被采用,但是带有表达式的 ifif {1.0 ==1.0}
被采用。
==
换成之后发生在我身上的另一件事eq
是0.0
and-0.0
使用时不相等eq
,但使用时相等==
。
这些差异的根源是什么?
我知道在浮点数比较中,最好使用一个小的 epsilon 来检查两个数字是否真的彼此接近,但在这种情况下,比较是为了避免被零除。
代码:
proc geometry_intersect_two_sections {xa1 ya1 xa2 ya2 xb1 yb1 xb2 yb2} {
if {($xa1 == $xa2) && ($xb1 == $xb2)} {
return {}
}
if {!($xa1 == $xa2)} {
set ma [expr (($ya1-$ya2)*1.0)/($xa1-$xa2)]
set na [expr $ya1 - ($ma * 1.0 * $xa1)]
}
if {!($xb1 == $xb2)} {
set mb [expr (($yb1-$yb2)*1.0)/($xb1-$xb2)]
set nb [expr $yb1 - ($mb * 1.0 * $xb1)]
}
if {$xa1 == $xa2} {
set retx [expr $xa1 * 1.0]
set rety [expr $retx * 1.0 * $mb + $nb]
if {($rety <= [max $yb1 $yb2]) && ($rety >= [min $yb1 $yb2]) && ($rety <= [max $ya1 $ya2]) && ($rety >= [min $ya1 $ya2]) && \
($retx <= [max $xb1 $xb2]) && ($retx >= [min $xb1 $xb2]) && ($retx <= [max $xa1 $xa2]) && ($retx >= [min $xa1 $xa2])} {ety]
} else {
return {}
}
}
if {$xb1 == $xb2} {
set retx [expr $xb1 * 1.0]
set rety [expr $retx * 1.0 * $ma + $na]
if {($rety <= [max $yb1 $yb2]) && ($rety >= [min $yb1 $yb2]) && ($rety <= [max $ya1 $ya2]) && ($rety >= [min $ya1 $ya2]) && \
($retx <= [max $xb1 $xb2]) && ($retx >= [min $xb1 $xb2]) && ($retx <= [max $xa1 $xa2]) && ($retx >= [min $xa1 $xa2])} {
return [list $retx $rety]
} else {
return {}
}
}
if {$mb == $ma} {
return {}
}
set retx [expr 1.0 * ($na - $nb)/($mb - $ma)]
set rety [expr 1.0 * ($ma * $retx) + $na]
if {($rety <= [max $yb1 $yb2]) && ($rety >= [min $yb1 $yb2]) && ($rety <= [max $ya1 $ya2]) && ($rety >= [min $ya1 $ya2]) && \
($retx <= [max $xb1 $xb2]) && ($retx >= [min $xb1 $xb2]) && ($retx <= [max $xa1 $xa2]) && ($retx >= [min $xa1 $xa2])} {
return [list $retx $rety]
} else {
return {}
}