diff --git a/.ic3_history b/.ic3_history
index eb62877..27e7889 100644
--- a/.ic3_history
+++ b/.ic3_history
@@ -1,16 +1,3 @@
-4/1 + 2/3
-1/6 + 2/3
-1/6 + 1/3
-1/6 - 1/3
-1/3 - 1/6
-1/3 * 1/6
-2/3 * 2/6
-2/3 * 5/6
-2/3 / 5/6
-sqrt(42)
-sqrt(41)
-sqrt(8)
-sqrt(4)
sqrt(9)
sqrt(16)
sqrt(-1)
@@ -97,3 +84,16 @@ sqrt(-2) * sqrt(-2)
(10 +i 20) / 3
(10/1 +i 20/1) / 3
(1/2 +i 2/3) / 2
+5 % 3
+5 mod 3
+15 mod 3
+-15 mod 3
+-15 mod -3
+-15 mod -2
+-15 mod -5
+-15 mod -6
+-15 mod 6
+3 mod sqrt(2)
+4 mod sqrt(2)
+2 mod sqrt(2)
+10 mod sqrt(2)
diff --git a/libc3/tag_mod.c b/libc3/tag_mod.c
index a7fb1fb..fb1376a 100644
--- a/libc3/tag_mod.c
+++ b/libc3/tag_mod.c
@@ -133,6 +133,9 @@ s_tag * tag_mod (const s_tag *a, const s_tag *b, s_tag *dest)
case TAG_F64:
return tag_init_f64(dest, fmod(integer_to_f64(&a->data.integer),
b->data.f64));
+ case TAG_F128:
+ return tag_init_f128(dest, fmodl(integer_to_f128(&a->data.integer),
+ b->data.f128));
case TAG_INTEGER:
dest->type = TAG_INTEGER;
integer_mod(&a->data.integer, &b->data.integer,
@@ -217,6 +220,8 @@ s_tag * tag_mod (const s_tag *a, const s_tag *b, s_tag *dest)
return tag_init_f32(dest, fmodf((f32) a->data.s8, b->data.f32));
case TAG_F64:
return tag_init_f64(dest, fmod((f64) a->data.s8, b->data.f64));
+ case TAG_F128:
+ return tag_init_f128(dest, fmodl((f128) a->data.s8, b->data.f128));
case TAG_INTEGER:
integer_init_s8(&tmp, a->data.s8);
dest->type = TAG_INTEGER;
@@ -276,6 +281,8 @@ s_tag * tag_mod (const s_tag *a, const s_tag *b, s_tag *dest)
return tag_init_f32(dest, fmodf((f32) a->data.s16, b->data.f32));
case TAG_F64:
return tag_init_f64(dest, fmod((f64) a->data.s16, b->data.f64));
+ case TAG_F128:
+ return tag_init_f128(dest, fmodl((f128) a->data.s16, b->data.f128));
case TAG_INTEGER:
integer_init_s16(&tmp, a->data.s16);
dest->type = TAG_INTEGER;
@@ -335,6 +342,8 @@ s_tag * tag_mod (const s_tag *a, const s_tag *b, s_tag *dest)
return tag_init_f64(dest, fmod((f64) a->data.s32, b->data.f32));
case TAG_F64:
return tag_init_f64(dest, fmod((f64) a->data.s32, b->data.f64));
+ case TAG_F128:
+ return tag_init_f128(dest, fmodl((f128) a->data.s32, b->data.f128));
case TAG_INTEGER:
integer_init_s32(&tmp, a->data.s32);
dest->type = TAG_INTEGER;
@@ -394,6 +403,8 @@ s_tag * tag_mod (const s_tag *a, const s_tag *b, s_tag *dest)
return tag_init_f64(dest, fmod((f64) a->data.s64, b->data.f32));
case TAG_F64:
return tag_init_f64(dest, fmod((f64) a->data.s64, b->data.f64));
+ case TAG_F128:
+ return tag_init_f128(dest, fmodl((f128) a->data.s64, b->data.f128));
case TAG_INTEGER:
integer_init_s64(&tmp, a->data.s64);
dest->type = TAG_INTEGER;
@@ -453,6 +464,8 @@ s_tag * tag_mod (const s_tag *a, const s_tag *b, s_tag *dest)
return tag_init_f64(dest, fmod((f64) a->data.sw, b->data.f32));
case TAG_F64:
return tag_init_f64(dest, fmod((f64) a->data.sw, b->data.f64));
+ case TAG_F128:
+ return tag_init_f128(dest, fmodl((f128) a->data.sw, b->data.f128));
case TAG_INTEGER:
integer_init_sw(&tmp, a->data.sw);
integer_mod(&tmp, &b->data.integer, &tmp2);
@@ -513,6 +526,8 @@ s_tag * tag_mod (const s_tag *a, const s_tag *b, s_tag *dest)
return tag_init_f32(dest, fmodf((f32) a->data.u8, b->data.f32));
case TAG_F64:
return tag_init_f64(dest, fmod((f64) a->data.u8, b->data.f64));
+ case TAG_F128:
+ return tag_init_f128(dest, fmodl((f128) a->data.u8, b->data.f128));
case TAG_INTEGER:
integer_init_u8(&tmp, a->data.u8);
dest->type = TAG_INTEGER;
@@ -572,6 +587,8 @@ s_tag * tag_mod (const s_tag *a, const s_tag *b, s_tag *dest)
return tag_init_f32(dest, fmodf((f32) a->data.u16, b->data.f32));
case TAG_F64:
return tag_init_f64(dest, fmod((f64) a->data.u16, b->data.f64));
+ case TAG_F128:
+ return tag_init_f128(dest, fmodl((f128) a->data.u16, b->data.f128));
case TAG_INTEGER:
integer_init_u16(&tmp, a->data.u16);
dest->type = TAG_INTEGER;
@@ -631,6 +648,8 @@ s_tag * tag_mod (const s_tag *a, const s_tag *b, s_tag *dest)
return tag_init_f64(dest, fmod((f64) a->data.u32, b->data.f32));
case TAG_F64:
return tag_init_f64(dest, fmod((f64) a->data.u32, b->data.f64));
+ case TAG_F128:
+ return tag_init_f128(dest, fmodl((f128) a->data.u32, b->data.f128));
case TAG_INTEGER:
integer_init_u32(&tmp, a->data.u32);
dest->type = TAG_INTEGER;
@@ -690,6 +709,8 @@ s_tag * tag_mod (const s_tag *a, const s_tag *b, s_tag *dest)
return tag_init_f64(dest, fmod((f64) a->data.u64, b->data.f32));
case TAG_F64:
return tag_init_f64(dest, fmod((f64) a->data.u64, b->data.f64));
+ case TAG_F128:
+ return tag_init_f128(dest, fmodl((f128) a->data.u64, b->data.f128));
case TAG_INTEGER:
integer_init_u64(&tmp, a->data.u64);
dest->type = TAG_INTEGER;
@@ -755,6 +776,8 @@ s_tag * tag_mod (const s_tag *a, const s_tag *b, s_tag *dest)
return tag_init_f64(dest, fmod((f64) a->data.uw, b->data.f32));
case TAG_F64:
return tag_init_f64(dest, fmod((f64) a->data.uw, b->data.f64));
+ case TAG_F128:
+ return tag_init_f128(dest, fmodl((f128) a->data.uw, b->data.f128));
case TAG_INTEGER:
integer_init_uw(&tmp, a->data.uw);
dest->type = TAG_INTEGER;