gpt4 book ai didi

c# - 定点模边缘情况

转载 作者:行者123 更新时间:2023-11-30 12:12:02 25 4
gpt4 key购买 nike

我正在实现 Q31.32 fixed-point numeric type基于 C# 中的 System.Int64。现在我正在尝试正确地进行模运算 (%)。

我见过的所有定点运算的实现都简单地根据整数模数定义 Qm.n 模数,即两个 Qm.n 数的模数是它们基础整数表示的模数。这在一般情况下有效,但在两种特定情况下失败:

  • x % y 抛出 OverflowException 如果 x == Int64.MinValuey == -1。我可以用 if 语句轻松处理这个问题并在中返回 0在这种情况下,尽管这是一种奇怪的行为(并且 unchecked 在这里没有帮助)。

  • x % yxy 的一些小值错误地返回 0。为了例如,如果 xy 的整数表示为 -41359(十进制:~-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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com