- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在实现 Q31.32 fixed-point numeric type基于 C# 中的 System.Int64。现在我正在尝试正确地进行模运算 (%)。
我见过的所有定点运算的实现都简单地根据整数模数定义 Qm.n 模数,即两个 Qm.n 数的模数是它们基础整数表示的模数。这在一般情况下有效,但在两种特定情况下失败:
x % y
抛出 OverflowException
如果 x == Int64.MinValue
和 y == -1
。我可以用 if 语句轻松处理这个问题并在中返回 0在这种情况下,尽管这是一种奇怪的行为(并且 unchecked
在这里没有帮助)。
x % y
为 x
和 y
的一些小值错误地返回 0。为了例如,如果 x
和 y
的整数表示为 -413
和 59
(十进制:~-0.000000096159 和~0,000000013737),模数为 0
(十进制:0)而它们的十进制值的模是(根据 System.Decimal)~-0.000000013737。这个错误大约是 60 倍类型的最大精度 (2^-32),因此不能将其视为舍入误差。
最后一个错误的原因是什么?我可以做些什么来获得更好的准确性?
最佳答案
我发现了问题。
-413 % 59 = 0 是正确的!!!
因为 -7 * 59 = -413
您假设的正确结果很可能取自 -413 的2s 补码,这会导致混淆。
[编辑 1]
在 Asik 的建议下,我使用了计算器,我对他的问题的最后评论是正确的。问题出在他的打印精度上,而不是在 2s 以上的补码或模数上,看这个:
413 >> 32 = 0.00000009615905582904815673828125
59 >> 32 = 0.00000001373700797557830810546875
0.00000009615905582904815673828125 / 0.00000001373700797557830810546875 = 7
0.00000009615905582904815673828125 % 0.00000001373700797557830810546875 = 0
有关打印数字的更多信息,请参阅:https://stackoverflow.com/a/18401040/2521214
附言您究竟是如何获得模数应为 ~-0.000000013737 的结果的?它可疑地等于 -59>>32 ...也许你的引用不能正确处理带符号的数字 (-413)<(59) 并抛出模的结果只是 59 因为它(避免除法)与 signum 结合从两个数字。
关于c# - 定点模边缘情况,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14271707/
当我在定点 Z3Py 中启用解释生成选项时,我收到包含以下消息的核心转储。 Error setting 'DL_GENERATE_EXPLANATIONS', reason: unknown opti
我正在开发一些代码,可以从 HW 获取浮点或定点数据。目前我们将其作为 float 。 底层API都是定点的。所以我们必须将数据作为定点传回。我们使用的算法是 Cholesky。我想知道为什么我们必须
我有一个关于在 MATLAB 中为 Texas Instruments TMS320C64xx DSP 编写算法的问题: 我在 MATLAB 中草率地实现了我的过滤器。我的目标是使用 MATLAB E
我需要将 float 转换为Q31定点,Q31表示1个符号位,0位表示整数部分,31位表示小数部分。这意味着 Q31 只能表示 [-1,0.9999] 范围内的数字。 根据定义,从浮点转换为定点时,会
我正在使用第 3 方定点 antilog() 函数来计算分贝 out_mag = 10^( in_db/20 ) 的幅度。 antilog() 采用 Q6.25 格式作为输入,并在输出时提供 Q16.
我想将一个定点数(Q31/int32 表示具有 31 个小数位的小数)除以另一个 Q31/int32。我想计算z = y/x,知道abs(x)>abs(y)。因此,z<1,因此可以表示为另一个Q31/
我是一名优秀的程序员,十分优秀!