SwiftのDecimal型のアンダーフローに少し戸惑ったので書きました。
結論から書けば、
アンダーフロー → 突然大きい値になる
オーバーフロー → NaNになる
早速、アンダーフローを起こして見ましょう。
内部10進数計算のDecimal型の変数に0.02を入れて、10回掛け合わせるプログラムです。
import Foundation
var cur = Decimal(string:"0.02")!
cur *= cur
cur *= cur
cur *= cur
cur *= cur
cur *= cur
cur *= cur
cur *= cur
cur *= cur
cur *= cur
cur *= cur
スクショが少し見にくいので結果を書き写すと以下の通り。
⓪0.02
①0.0004
②0.00000016
③0.0000000000000256
④0.00000000000000000000000000065536
⑤0.0000000000000000000000000000000000000000000000000000004294967296
⑥0.00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000018446744073709551616
⑦340282366920938463463374607431768211460
⑧115792089237316195423570985008687907856000000000000000000000000000000000000000
⑨13407807929942597099574024998205846128100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
⑩NaN
0 < a < 1となる数を掛け合わせれば値はどんどん小さくなるはずですが、途中アンダーフローを起こしているので、1以上の大きい数になって(⑦)、さらにそれを掛け合わして今度はオーバフローを起こして最終的にNaNになってますね(⑩)。
https://qiita.com/Hiroki_Kawakami/items/1867a1ff91fee5b90d61
上のURLを参考にするとDecimal型でアンダーフローの恐れがある場合は、掛け算の時に両辺の絶対値が1未満の時にもし答えの絶対値が1以上になるときは、チェックをした方が良さそうですね。