问题标签 [x87]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
3 回答
940 浏览

c - 有什么方法可以使用 i387 fsqrt 指令进行正确的舍入?

有什么方法可以使用 i387 fsqrt 指令进行正确的舍入?...

...除了更改x87 控制字中的精度模式之外 - 我知道这是可能的,但这不是一个合理的解决方案,因为它有令人讨厌的可重入类型问题,如果 sqrt 操作被中断,精度模式将是错误的。

我正在处理的问题如下:x87fsqrt操作码以 fpu 寄存器的精度执行正确舍入(根据 IEEE 754)的平方根运算,我假设它是扩展(80 位)精度。但是,我想用它来实现高效的单精度和双精度平方根函数,结果正确舍入(根据当前舍入模式)。由于结果精度过高,将结果转换为单精度或双精度的第二步再次舍入,可能会留下不正确舍入的结果。

通过一些操作,可以通过偏差来解决这个问题。例如,我可以通过以 2 的幂的形式添加一个偏差,将双精度值的 52 个有效位强制转换为 63 位扩展精度尾数的最后 52 位,从而避免加法结果的精度过高. 但是我看不到任何明显的方法可以用平方根来做这样的把戏。

有什么聪明的主意吗?

(也标记为 C,因为预期的应用是 Csqrtsqrtf函数的实现。)

0 投票
2 回答
691 浏览

assembly - 除法 8086/8087 1/3 =3?

我在使用时遇到了很大的问题fdiv!!!!我正在尝试划分1/3,所以这就是我所做的

如您所见,我将结果移至,resultado因为我看不到结果st(0)(我正在使用 tasm,所以我只能在调试器中看到变量)结果应该是3EAAAA3A但我得到了40400000......那是3!!!这怎么可能??我尝试交换变量,但什么也没有!!!你能帮助我吗??=(

0 投票
4 回答
2758 浏览

assembly - FSTENV? 几乎找不到有关此指令的任何信息

我在一个程序中有这个指令:

它有什么作用?

它使用和更新哪些寄存器?

谢谢!

0 投票
2 回答
345 浏览

c++ - 在 C++ 中重置 8087CW 导致 .NET 应用程序出现异常

我正在使用 C# 中的 .NET 3.5 应用程序,它定期调用一些遗留 C++ 代码。我注意到,当我将鼠标悬停在具有下拉列表的 Infragistics UltraGrid 上时,调用 C++ 有时会导致“上溢或下溢算术运算”。我发现这只发生在 C++ 代码执行以下操作时:

如果我注释掉最后一行,我的 .NET 应用程序中将不再出现错误。我没有注意到应用程序的其余部分有任何其他副作用。作为快速修复,我想将此行注释掉。禁用 FPU 异常而不重置控制字的后果是什么?

0 投票
2 回答
654 浏览

c++ - 这是 sqrt 函数中的错误吗

sqrt我创建了一个应用程序来计算 64 位范围内的素数,所以当我尝试使用来自的函数计算 64 位数的平方根时,math.h我发现答案不准确,例如当输入是~0ull答案应该是~0u但我得到的0x100000000一个是不正确的,所以我决定使用汇编 x86 语言创建我自己的版本,看看这是否是一个错误,这是我的功能:

输入是奇数以获得其平方根。当我用相同的输入测试我的函数时,结果是一样的。

我不明白为什么这些函数会围绕结果,或者具体为什么sqrt指令会围绕结果?

0 投票
1 回答
504 浏览

assembly - GCC 在转换 unsigned int 时如何使用 fildll?

英特尔指令集参考声明(强调我的):

将有符号整数源操作数转换为双扩展精度浮点格式并将值压入 FPU 寄存器堆栈。源操作数可以是字、双字或四字整数。它加载时没有舍入错误。源操作数的符号被保留。该指令在非 64 位模式和 64 位模式下的操作相同。

在这里你可以看到我的测试用例:

0 投票
5 回答
17690 浏览

c - 在汇编中添加浮点数/双精度数

我正在尝试使用内联汇编,并尝试在内联汇编中添加十进制数(不,不是整数)。问题是,当我调用以下函数时:

编译器抱怨内联汇编中的操作数大小不正确(所有汇编行,不包括 push 和 pop 指令行)。所以只好改成整数类型,比如unsigned long,然后就可以了,不过当然只支持整数类型;十进制结果四舍五入。

有没有办法添加允许像 8.4 这样的十进制结果的程序集?

0 投票
1 回答
1238 浏览

c++ - 浮点指令异常——FLDZ 故障?

我正在尝试调试我之前在这里发布的问题: C++ 和 pin 工具 - IF 语句非常奇怪的 DOUBLE 变量问题。我使用 gdb 追踪了发生奇怪行为的时刻。我发现如下图所示,它显示了显示反汇编代码和浮点寄存器值的 gdb 屏幕截图。(此处为大图) FLDZ指​​令执行前后 左侧图像显示了突出显示的FLDZ指令执行前的屏幕截图,右侧图像显示了指令执行后的屏幕截图。我查了 x86 ISA 并FLDZ用于加载+0.0ST(0). 但是,我得到的是-nan而不是+0.0. 有人知道为什么会这样吗?我使用的系统是运行 64 位 CentOS 的 Intel xeon 5645,但我尝试调试的目标程序是 32 位应用程序。另外,正如我在前一篇文章中提到的,我尝试了两个版本的 gcc,4.2.4 和 4.1.2,并发现了同样的问题。谢谢。

--add-- 顺便说一下,下面是源代码。

0 投票
2 回答
9301 浏览

assembly - 如何将 ST(0) 移动到 EAX?

你好,我正在学习 x86 FPU 组装,我有一个简单的问题,我找不到答案:

如何将值从ST(0)(FPU 堆栈的顶部)移动到EAX

另外:
此代码是否正确:

0 投票
4 回答
1437 浏览

c++ - Visual C++ 2012 中的正弦计算不一致?

考虑以下代码:

使用 Visual C++ 2012 ( cl fputest.cpp) 编译并执行程序时,输出如下:

问题:

  • 为什么这两个值不同?
  • 是否可以发布一些编译器选项,以便计算的正弦值完全相同?