Числа с плавающей запятой (на всех языках, не только Tcl) представляют большинство чисел несколько неточно. Таким образом, их обычно не следует сравнивать на равенство, поскольку это действительно маловероятно. Вместо этого вы должны проверить, находятся ли эти два значения в определенном количестве друг друга (сумма известна как epsilon и учитывает, что есть небольшие ошибки в вычислениях с плавающей точкой).
В вашем коде вы могли бы написать это:
set epsilon 0.001; # Small, but non-zero
if { $epsilon < $n_rval && $n_rval < 1-$epsilon} {
set onextensionFlag 0;# inside clipping area
} elseif {abs($n_rval) < $epsilon || abs(1-$n_rval) < $epsilon} {
set onextensionFlag 1 ;# inside clipping area (but on point)
} elseif { $n_rval >= 1+$epsilon || $n_rval <= -$epsilon } {
set onextensionFlag 2 ;# outside clipping area
} else {
set onextensionFlag 3 ;# consider inside clipping area
}
В основном, думайте в терминах числовой линии, где вы меняете точки на небольшие интервалы:
0 1
————————————————|————————————————|————————————————
до
0-ε 0+ε 1-ε 1+ε
———————————————(—)——————————————(—)———————————————
Как делать проверки для того диапазона, в котором вы находитесь, затем следовать из этого.