我想知道这里是否有人知道c#中定点数学的任何好资源?我见过这样的事情(http://2ddev.72dpiarmy.com/viewtopic.php?id=156)和这个(定点数学的最佳方法是什么?),以及关于是否十进制的一些讨论实际上是固定点或实际浮点(更新:响应者已经确认它肯定是浮点数),但是我还没有看到一个可靠的C#库来计算余弦和正弦.
我的需求很简单 - 我需要基本的操作符,加上余弦,正弦,arctan2,PI ...我认为这就是它.也许sqrt.我正在编写一个2D RTS游戏,我已经在很大程度上工作了,但是使用浮点数学(双精度)时的单位运动在多台机器上随着时间的推移(10-30分钟)有很小的不准确性,从而导致了desyncs.目前这只是在32位操作系统和64位操作系统之间,所有32位机器似乎保持同步没有问题,这使我认为这是一个浮点问题.
我从一开始就意识到这是一个可能的问题,所以尽可能地限制了我对非整数位置数学的使用,但是为了在不同的速度下平滑对角线移动,我正在以弧度计算点之间的角度,然后用sin和cos得到运动的x和y分量.这是主要问题.我还对线段交叉点,线圆交叉点,圆矩交点等进行了一些计算,这些计算也可能需要从浮点移动到定点以避免跨机器问题.
如果在Java或VB或其他类似语言中有开源的话,我可能会将代码转换为我的用途.我的主要优先考虑的是准确性,尽管我希望尽可能减少速度损失而不是现在的性能.这整个定点数学对我来说是非常新的,我很惊讶谷歌上的实用信息很少 - 大多数东西似乎是理论或密集的C++头文件.
你可以做的任何事情都指向我正确的方向非常感谢; 如果我可以使这个工作,我计划开源我放在一起的数学函数,以便有其他C#程序员的资源.
更新:我绝对可以使余弦/正弦查找表适用于我的目的,但我认为这不适用于arctan2,因为我需要生成一个包含大约64,000x64,000个条目(yikes)的表.如果您知道有关计算arctan2等事物的有效方法的任何程序性解释,那将是非常棒的.我的数学背景还可以,但是高级公式和传统的数学符号对我来说很难翻译成代码.
为了加快我的bignum除数,我需要加速y = x^2bigints的操作,bigints被表示为无符号DWORD的动态数组.要明确:
DWORD x[n+1] = { LSW, ......, MSW };
Run Code Online (Sandbox Code Playgroud)
x = x[0]+x[1]<<32 + ... x[N]<<32*(n)问题是:如何在y = x^2没有精度损失的情况下尽快计算?
- 使用C++和整数算术(32位带Carry)处理.
我目前的方法是应用乘法y = x*x并避免多次乘法.
例如:
x = x[0] + x[1]<<32 + ... x[n]<<32*(n)
Run Code Online (Sandbox Code Playgroud)
为简单起见,让我重写一下:
x = x0+ x1 + x2 + ... + xn
Run Code Online (Sandbox Code Playgroud)
其中index表示数组内的地址,因此:
y = x*x
y = (x0 + x1 + x2 + ...xn)*(x0 + x1 + x2 + ...xn)
y = x0*(x0 …Run Code Online (Sandbox Code Playgroud)