- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在使用软件渲染器开发一款游戏,以获得最准确的 PS1 外观。当我研究 PS1 图形/渲染系统的工作原理、顶点摇晃的原因等时,我看到了一些关于它们如何划分的文档。这是它的链接:http://problemkaputt.de/psx-spx.htm#gteoverview (参见“GTE 分区不准确”部分)
相关代码:
if (H < SZ3*2) then ;check if overflow
z = count_leading_zeroes(SZ3) ;z=0..0Fh (for 16bit SZ3)
n = (H SHL z) ;n=0..7FFF8000h
d = (SZ3 SHL z) ;d=8000h..FFFFh
u = unr_table[(d-7FC0h) SHR 7] + 101h ;u=200h..101h
d = ((2000080h - (d * u)) SHR 8) ;d=10000h..0FF01h
d = ((0000080h + (d * u)) SHR 8) ;d=20000h..10000h
n = min(1FFFFh, (((n*d) + 8000h) SHR 16)) ;n=0..1FFFFh
else n = 1FFFFh, FLAG.Bit17=1, FLAG.Bit31=1 ;n=1FFFFh plus overflow flag
我很难理解它是如何工作的,这个“unr”表是什么?我们为什么要改变事情?如果有人可以更详细地解释这件事实际上是如何实现鸿沟的,我们将不胜感激。
最佳答案
该算法是[0,1)中两个无符号16位小数值的定点除法。它首先通过表查找计算除数倒数的初始 9 位近似值,然后使用单个 Newton-Raphson 迭代对倒数 xi+1 := x 进行细化i * (2 - d * xi),得到精确到大约 16 位的倒数,最后将其乘以被除数,得到 [0,2 中的 17 位商).
对于表查找,除数首先通过应用比例因子 2z 归一化为 [0.5, 1),显然被除数随后需要通过相同的比例因子进行调整。由于 [0.5, 1) 中操作数的倒数将为 [1,2],因此已知倒数的整数位为 1,因此可以使用 8 位表项来产生 1.8 定点数通过添加 0x100
(= 1) 来取反。此处使用 0x101
的原因尚不清楚;这可能是由于要求此步骤始终提供对真实倒数的高估。
接下来的两个步骤是 Newton-Raphson 迭代的逐字翻译,用于考虑定点比例因子的倒数。所以 0x2000000
代表 2.0。该代码使用 0x2000080
,因为它包含一个舍入常数 0x80
(=128),用于随后除以 256,用于重新缩放结果。下一步同样添加 0x00000080
作为重新缩放除以 256 的舍入常数。如果没有缩放,这将是一个纯乘法。
最后的乘法 n*d
将 d
中的倒数与 n
中的被除数相乘,得到 33 位的商。同样,在除以 65536 之前应用舍入常数 0x8000 以重新调整到适当的范围,以 1.16 定点格式给出商。
连续重新缩放是定点计算的典型特征,在这种计算中,人们试图使中间结果尽可能大,以最大限度地提高最终结果的准确性。有点不寻常的是舍入应用于所有中间算术,而不仅仅是最后一步。也许有必要达到特定的精度水平。
不过,该函数并不是那么准确,这可能是由于初始近似值不准确造成的。在所有非异常情况下,2,424,807,756 匹配正确舍入的 1.16 定点结果,780,692,403 有 1 ulp 的误差,15,606,093 有 2-ulp 误差,86,452 有 3-ulp 误差。在快速实验中,初始近似 u
中的最大相对 误差为 3.89e-3。改进的表查找将 u
中的最大相对误差减少到 2.85e-3,减少但没有消除最终结果中的 3-ulp 错误。
如果你想看一个具体的例子,考虑h
=0.3(0x4ccd
)除以SZ3
=0.2( 0x3333
)。那么z
=2,因此d
=0.2*4 = 0.8 (0xcccc
)。这导致 u
= 1.25 (0x140
)。由于估计非常准确,我们期望 (2 - d * u) 接近 1,而事实上,d
= 1.000015 (0x10001
)。精化后的倒数为 d
=1.250015 (0x14001
),因此商为 n
=1.500031 (0x18002
).
关于c - 这个除法近似算法是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41785903/
#include using namespace std; class C{ private: int value; public: C(){ value = 0;
这个问题已经有答案了: What is the difference between char a[] = ?string?; and char *p = ?string?;? (8 个回答) 已关闭
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 7 年前。 此帖子已于 8 个月
除了调试之外,是否有任何针对 c、c++ 或 c# 的测试工具,其工作原理类似于将独立函数复制粘贴到某个文本框,然后在其他文本框中输入参数? 最佳答案 也许您会考虑单元测试。我推荐你谷歌测试和谷歌模拟
我想在第二台显示器中移动一个窗口 (HWND)。问题是我尝试了很多方法,例如将分辨率加倍或输入负值,但它永远无法将窗口放在我的第二台显示器上。 关于如何在 C/C++/c# 中执行此操作的任何线索 最
我正在寻找 C/C++/C## 中不同类型 DES 的现有实现。我的运行平台是Windows XP/Vista/7。 我正在尝试编写一个 C# 程序,它将使用 DES 算法进行加密和解密。我需要一些实
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 1
有没有办法强制将另一个 窗口置于顶部? 不是应用程序的窗口,而是另一个已经在系统上运行的窗口。 (Windows, C/C++/C#) 最佳答案 SetWindowPos(that_window_ha
假设您可以在 C/C++ 或 Csharp 之间做出选择,并且您打算在 Windows 和 Linux 服务器上运行同一服务器的多个实例,那么构建套接字服务器应用程序的最明智选择是什么? 最佳答案 如
你们能告诉我它们之间的区别吗? 顺便问一下,有什么叫C++库或C库的吗? 最佳答案 C++ 标准库 和 C 标准库 是 C++ 和 C 标准定义的库,提供给 C++ 和 C 程序使用。那是那些词的共同
下面的测试代码,我将输出信息放在注释中。我使用的是 gcc 4.8.5 和 Centos 7.2。 #include #include class C { public:
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
我的客户将使用名为 annoucement 的结构/类与客户通信。我想我会用 C++ 编写服务器。会有很多不同的类继承annoucement。我的问题是通过网络将这些类发送给客户端 我想也许我应该使用
我在 C# 中有以下函数: public Matrix ConcatDescriptors(IList> descriptors) { int cols = descriptors[0].Co
我有一个项目要编写一个函数来对某些数据执行某些操作。我可以用 C/C++ 编写代码,但我不想与雇主共享该函数的代码。相反,我只想让他有权在他自己的代码中调用该函数。是否可以?我想到了这两种方法 - 在
我使用的是编写糟糕的第 3 方 (C/C++) Api。我从托管代码(C++/CLI)中使用它。有时会出现“访问冲突错误”。这使整个应用程序崩溃。我知道我无法处理这些错误[如果指针访问非法内存位置等,
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 7 年前。
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于 Stack Overflow 来说是偏离主题的,因为
我有一些 C 代码,将使用 P/Invoke 从 C# 调用。我正在尝试为这个 C 函数定义一个 C# 等效项。 SomeData* DoSomething(); struct SomeData {
这个问题已经有答案了: Why are these constructs using pre and post-increment undefined behavior? (14 个回答) 已关闭 6
我是一名优秀的程序员,十分优秀!