と書けるようになり、プログラムが簡潔になる。
To compute the cubic root of a real number, function pow is available.
However, this function assumes a non-negative value for the 1st argument.
To calculate the cubic root of a negative value,
“the cubic root of the absolute value of the real number
multiplied with \(-1\)” must be computed.
The purpose of function sqrt3
is to avoid this branching operation.
Using this function, the cubic root can be calculated by only one line
regardless of the sign of the real number.
Namely, a code
by the use of this function.
In this way, the code becomes brief.
また、中身が0であるか否かの判定をdoublecmp関数を用いて行うことにより、
0に非常に近い数の3乗根を取った場合の不安定を回避する狙いもある。
0は何乗しても0であるが、0から非常にわずかにずれた数は
3乗根を取ると0から離れる方向に変化するため、
数値計算のわずかな誤差によって本来ゼロであるべき数が
非常に小さなノンゼロの数(例えば\(10^{-18}\))になった場合に、
その1/3乗を取ると誤差が増幅されてしまう(上の例では\(10^{-6}\)となる)。
しかし、doublecmp関数を用いればこの問題は回避できる。
関数sqrt3では内部でdoublecmp関数を用いて
ゼロに非常に近い数の3乗根をゼロとするようにしている。
この仕様により、デフォルトのZERO_THRESHOLDを用いる場合には
sqrt(1.0e-18)=0.0となる。
Another purpose of this function is to avoid a numerical instability
in case of a value very close to 0.
Note that a value which is very close to but not exactly same as 0
will leave from zero by taking the cubic root.
For example, consider a situation where a value which should theoretically be 0
becomes a very small non-zero value (e.g., \(10^{-18}\))
due to numerical errors.
Taking a cubic root, this error is amplified to \(10^{-6}\).
This problem can be avoided by the use of function doublecmp.
The function sqrt3 internally calls doublecmp
to force the cubic root of a very small non-zero value to zero.
Awing to this algorithm, sqrt(1.0e-18)=0.0
as long as the default value of ZERO_THRESHOLD is used.