diff --git a/src/canonicalize.rs b/src/canonicalize.rs
index 0e0a81447..804074e09 100644
--- a/src/canonicalize.rs
+++ b/src/canonicalize.rs
@@ -3532,6 +3532,7 @@ impl CanonicalizeContext {
"\u{02C9}"| "\u{0304}"| "\u{0305}" => "\u{00AF}",
"\u{02DC}" | "~" => "\u{223C}", // for base, use version with prefix and infix
"\u{01C1}" => "\u{2016}", // U+2016 is "‖"
+ "!!" => "\u{203C}", // U+203C is "‼" (double factorial)
_ => mo_text,
};
diff --git a/src/operator-info.in b/src/operator-info.in
index 41bccb38b..1417d305e 100644
--- a/src/operator-info.in
+++ b/src/operator-info.in
@@ -114,6 +114,7 @@ phf_map! {
"‵" => OperatorInfo{ op_type: OperatorTypes::POSTFIX, priority: 880, next: &None },
"‶" => OperatorInfo{ op_type: OperatorTypes::POSTFIX, priority: 880, next: &None },
"‷" => OperatorInfo{ op_type: OperatorTypes::POSTFIX, priority: 880, next: &None },
+ "‼" => OperatorInfo{ op_type: OperatorTypes::POSTFIX, priority: 810, next: &None },
"‾" => OperatorInfo{ op_type: OperatorTypes::POSTFIX, priority: 880, next: &None },
"⁃" => OperatorInfo{ op_type: OperatorTypes::INFIX, priority: 390, next: &None },
"⁄" => OperatorInfo{ op_type: OperatorTypes::INFIX, priority: 680, next: &None },
diff --git a/tests/Languages/en/ClearSpeak/symbols_and_adornments.rs b/tests/Languages/en/ClearSpeak/symbols_and_adornments.rs
index 5d0104e65..0829a4a3e 100644
--- a/tests/Languages/en/ClearSpeak/symbols_and_adornments.rs
+++ b/tests/Languages/en/ClearSpeak/symbols_and_adornments.rs
@@ -374,4 +374,15 @@ fn vertical_line_evaluated_at_both_given() -> Result<()> {
"x squared plus x, evaluated at 1 minus the same expression evaluated at 0")?;
return Ok(());
-}
\ No newline at end of file
+}
+
+#[test]
+fn double_factorial_test() -> Result<()> {
+ let expr1 = "";
+ let expr2 = "";
+ test("en", "ClearSpeak", expr2, "5 double factorial")?;
+ test("en", "ClearSpeak", expr1, "5 double factorial")?;
+ test("en", "SimpleSpeak", expr1, "5 double factorial")?;
+ Ok(())
+}
+
\ No newline at end of file