decimal_checked チュートリアル
DecimalChecked は current defined Decimal、IEEE context、latest flags、accumulated flags、optional certification error を保持します。
IEEE Flags の累積
moonbit
///|
test "IEEE checked decimal pipeline" {
let context = @decimal.DecimalContext::new(precision=3)
let checked = @decimal_checked.DecimalChecked::parse("1.2345", context)
.add(@decimal.Decimal::one())
inspect(checked.value().to_string(), content="2.23")
inspect(
checked.raised().contains(@decimal.DecimalSignal::Inexact),
content="true",
)
inspect(
checked.flags().contains(@decimal.DecimalSignal::Rounded),
content="true",
)
}raised() は last operation、flags() は combined history、outcome() は value + combined flags。
Defined Exceptional Result の保持
moonbit
///|
test "IEEE checked defined result" {
let checked = @decimal_checked.DecimalChecked::from_int(
1,
@decimal.DecimalContext::decimal64(),
).div(@decimal.Decimal::zero())
inspect(checked.value().is_infinite(), content="true")
inspect(
checked.raised().contains(@decimal.DecimalSignal::DivisionByZero),
content="true",
)
inspect(checked.is_ok(), content="true")
}is_ok() は ArithmeticError がない意味で flags empty ではありません。Certification failure は error() へ入り short-circuit、IEEE conditions は value+flags を保持します。
Status Window の Reset
clear_flags() は value/context を保持して flags を clear。with_context は new IEEE context で current value を再 apply し flags を記録する observable step です。
Independent Pipeline を Merge しない
Binary method は plain Decimal を受け、二つの context/history を暗黙 merge しません。合流時は application が context と merge policy を決めます。
推奨事項
- Step policy は
raised()、end-to-end はflags()。 is_ok()とflags().has_error()を区別。- Status consumption 後に clear。
- Outer boundary で
result()。 - GDA trap は
decimal_gda_checked。
Design と decimal Tutorial を参照してください。