为什么没有为实数值定义 mod 运算符?

Why is the mod operator not defined for real values?

我想计算和模拟时钟相移,当我 运行 遇到 VHDL 没有为 REAL 值定义 mod 运算符的问题时。

我检查了我的旧 VHDL 书和这本 online source。两者都提到 mod 表示整数,但没有提到数字(包括浮点数)。

GHDL 还报告 mod 为未知。

示例计算:

constant Period     : TIME := 10.0 ns;
constant PhaseDelay : TIME := Period * (((Phase + 360.0) mod 360.0) / 360.0);

为什么没有为实数值定义 mod 运算符?

Modulo/Remainer 正 整数 值 a、b 的定义:
a = (a/b)*b + (a REM b)

这个方程也可以用于计算负数的余数。 modulo 负数运算需要一些技巧来处理符号,但它也是基于 add、sub、mult、div.

模对整数有很好的定义,但对实数则不然。模给你整数除法的余数a / b,但实数除法没有余数,它给你一个实...

例如,如果您执行 13 除以 3。整数除法将得到 4,余数(模)为 1。实数除法将得到大约 4.333333333333,没有余数,因为它是精确的(忽略数字的有限表示)。

要在 a / b = c 的实际除法后获得模数,您必须执行类似 (c - floor(c))*b 的操作。在  13/4 示例的情况下,它返回 1.

我遇到了类似的问题,很容易就解决了。我有一个实数变量 r 我需要对其进行钳制(如 modulo 中所示),因此它保持不变在 0.0 到 1.0 的范围内。首先我创建一个整数 i = floor(r ).然后我从 r 中减去 i 得到我的答案.如果您的代码允许您缩放结果,我怀疑将其乘以 360 会得到所需的结果。

这可能不满足“实数取模”的定义,但至少就我的目的而言,结果是令人满意的。