1

在给定角度的理想世界中,恒等式 FSIN * FSIN + FCOS * FCOS = 1 始终成立,但由于浮点限制,它并不完全正确。例如,将一个小值(如单个 0x2F800001)传递给 FCOS 将给出 1 的结果,而 FSIN 将给出大于零的结果,因此在这种情况下 FSIN * FSIN + FCOS * FCOS > 1 。

在我正在处理的当前应用程序中,这是不可接受的,但如果 FSIN * FSIN + FCOS * FCOS <= 1 是可以接受的。可悲的是,即使在向零 FPU 舍入模式下,上述结果仍然会发生,所以我需要对此做点什么。

我只是想知道是否有人有一个比重新定义 FSIN 或 FCOS 更快的解决方案,因为该解决方案的性能相当低: FSIN = sqrt(1- FCOS * FCOS ) 。

我宁愿不使用任何外部库来让客户满意,所以想要一个汇编程序或 delphi 的解决方案(客户使用 delphi 2009)。

编辑:

function test_asm2:single;
asm // math coprocessor set to no exceptions, 53 bits precision, and round towards zero
 mov word([esp-2]),$1E3F
 fldcw word([esp-2])

 mov dword([esp-4]),$2F800001

 fld dword([esp-4])
 fsin
 fmul st(0),st(0)

 fld dword([esp-4])
 fcos
 fmul st(0),st(0)

 faddp
end;

这与我描述的想要发生的完全一样,FSIN * FSIN + FCOS * FCOS <= 1 对于所有有效角度,舍入标志设置为 trunc。因此,当我明天回去工作时,我将不得不跟踪以找到客户端的编译器在哪里重置舍入模式,或者制作一个汇编版本的计算。

4

0 回答 0