gpt4 book ai didi

Delphi:如何翻译这个对 IEEE float 执行低级访问的 C 代码?

转载 作者:行者123 更新时间:2023-12-03 15:37:11 27 4
gpt4 key购买 nike

以下 C 函数来自 fastapprox项目。

static inline float 
fasterlog2 (float x)
{
union { float f; uint32_t i; } vx = { x };
float y = vx.i;
y *= 1.1920928955078125e-7f;
return y - 126.94269504f;
}

我知道C union可以翻译为Delphi变体记录,但我在将如此低级的C代码翻译为Delphi时仍然遇到困难。希望这里的Delphi专家愿意帮忙。

更多信息

我稍后添加这一部分,这不是问题的一部分。本节为希望获得更高准确性的读者提供信息。

最佳答案

我想我可以通过使用指针强制转换来实现重新解释强制转换来对其进行编码:

function fasterlog2(x: single): single;
const
c1: Single = 1.1920928955078125e-7;
c2: Single = 126.94269504;
var
y: single;
begin
y := PCardinal(@x)^;
Result := y * c1 - c2;
end;

请注意,我使用了 single 类型的类型常量来确保与 C 代码完全匹配。

我真的不认为 Delphi 实现中需要变体记录。

或者您可以使用纯 asm 方法。 x86 版本如下所示:

function fasterlog2asm(x: single): single;
const
c1: Single = 1.1920928955078125e-7;
c2: Single = 126.94269504;
asm
FILD DWORD PTR [ESP+$08]
FMUL c1
FSUB c2
FWAIT
end;

对于 x64,SSE 实现为

function fasterlog2asm64(x: single): single;
const
c1: double = 1.1920928955078125e-7;
c2: double = 126.94269504;
asm
CVTDQ2PD xmm0, xmm0
MULSD xmm0, c1
SUBSD xmm0, c2
CVTSD2SS xmm0, xmm0
end;

在 x64 中,汇编版本的性能仅是纯 pascal 函数的两倍左右。 x86 汇编版本的性能是其五倍以上 - 这完全是由于 SSE 中的类型转换(整数/单/双)成本比 x87 更高。

可以使用这种方法的原因是 float 表示为

significand * base^exponent

并使用值 2 作为基数。

关于Delphi:如何翻译这个对 IEEE float 执行低级访问的 C 代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31067200/

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