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

Pae*_*els 4 vhdl

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

我检查了我的旧 VHDL 书和这个在线资源。两者都提到mod了整数,但没有提到数字(包括浮点数)。

GHDL 也报告mod为未知。

计算示例:

constant Period     : TIME := 10.0 ns;
constant PhaseDelay : TIME := Period * (((Phase + 360.0) mod 360.0) / 360.0);
Run Code Online (Sandbox Code Playgroud)

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

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

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

Jon*_*let 5

模对于整数有明确的定义,但对于实数则不然。模数为您提供整数除法的余数a / b,但实数除法没有余数,它为您提供真正的...

\n\n

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

\n\n

要在实除后获得模数a / b = c,您必须执行类似的操作(c - floor(c))*b。在本例中\xc2\xa013/4,它返回 1。

\n

  • 你可以使用“fmod”,我在 C++ 和图形卡着色器语言中都见过它。它执行的操作与我发布的不同:“fmod(a, b) = a - Floor(a/b)*b”,它将“a”包裹在“b”周围。不过,您可能必须小心负数。 (2认同)