Я делаю много математики в моей работе, тестирующей смешанные полупроводники сигнала на Оборудовании автоматического тестирования от Teradyne (c, vba), Advantest (C++ .NET), и т.п..
Два защитных маневра, которые я использую:
предотвращают деление на нуль, если (x! =0) {z=y/x;} еще {/* дают z распознаваемое поддельное число, продолжаются, программа */}
не передают нулевые или отрицательные числа для входа вычислений. Это характерно для вычислений усиления, CMRR и PSRR. если (x> 0) {psrr = 20 * журнал (x);} еще {psrr =-999; число/*fake */}
Некоторые могут привести доводы против использования поддельных чисел, но эти программы используются в полупроводниковом производстве очень большого объема. Если ошибка происходит при тестировании плохой части, лучше продолжить тестировать и сохранять целостность формата данных. Поддельные числа легко разделяются как выбросы во время последующей обработки данных тестирования.
- микрофон
Нет, вам придется разделять типы (как в сообщении kvb). Я слышал о планах добавить полиморфную дисперсию (как в ocaml) в F # , что позволит вам делать нечто подобное.
In ocaml,
type mainType =
| A of [ `AA of int | `AB of float ]
| B of int
Нет, я так не думаю. Кажется, не имеет большого преимущества перед созданием двух отдельных типов объединения, например:
type NestedType =
| AA of int
| AB of float
type MainType =
| A of NestedType
| B of int
let mainValue = A (AA 1)