【发布时间】:2018-09-30 15:09:09
【问题描述】:
我想在汇编中做什么:
facing_x = math.cos(Pitch) * math.cos(Yaw)
我是怎么做的:
fld qword [Pitch]
fcos
fst [cos]
fld qword [Yaw]
fcos
fst [cos2]
movss xmm5,[cos]
movss xmm7,[cos2]
mulss xmm5,xmm7
movss [facing_x],xmm5
我总是得到:1
无论两个输入,我总是得到 1 或 0 作为结果 face_x
我做错了什么?我的意思是肯定有什么我不明白的地方!
【问题讨论】:
-
您是否尝试过用 c 编写代码并查看程序集是什么?
-
哦,
fst可能默认为 64b 或 80b 精确,你甚至没有写你使用的编译器......但movss正在寻找“浮动”,所以@ 987654325@ 可能会更安全。再次使用调试器检查是验证存储/恢复正确字节数以及所有转换/值是否符合预期的最简单方法。 -
您不妨使用
fmul。除非您需要将您的 cos 结果舍入为单精度,否则将它们存储到内存并使用 SSE1 重新加载是零点。比如 fld / fcos / fld / fcos / fmulp /fstp dword [facing_x]。注意使用fmulp和fstp来弹出两个cos结果。 -
请出示您的完整代码,包括
Pitch、Yaw等的定义。您显示的 sn-p 不足以正确诊断您的问题。 -
AFAIK,@PeterCordes 观察到的行为甚至记录在原始 8087 数据表中。