问题标签 [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.
c - 有什么方法可以使用 i387 fsqrt 指令进行正确的舍入?
有什么方法可以使用 i387 fsqrt 指令进行正确的舍入?...
...除了更改x87 控制字中的精度模式之外 - 我知道这是可能的,但这不是一个合理的解决方案,因为它有令人讨厌的可重入类型问题,如果 sqrt 操作被中断,精度模式将是错误的。
我正在处理的问题如下:x87fsqrt
操作码以 fpu 寄存器的精度执行正确舍入(根据 IEEE 754)的平方根运算,我假设它是扩展(80 位)精度。但是,我想用它来实现高效的单精度和双精度平方根函数,结果正确舍入(根据当前舍入模式)。由于结果精度过高,将结果转换为单精度或双精度的第二步再次舍入,可能会留下不正确舍入的结果。
通过一些操作,可以通过偏差来解决这个问题。例如,我可以通过以 2 的幂的形式添加一个偏差,将双精度值的 52 个有效位强制转换为 63 位扩展精度尾数的最后 52 位,从而避免加法结果的精度过高. 但是我看不到任何明显的方法可以用平方根来做这样的把戏。
有什么聪明的主意吗?
(也标记为 C,因为预期的应用是 Csqrt
和sqrtf
函数的实现。)
assembly - 除法 8086/8087 1/3 =3?
我在使用时遇到了很大的问题fdiv
!!!!我正在尝试划分1/3
,所以这就是我所做的
如您所见,我将结果移至,resultado
因为我看不到结果st(0)
(我正在使用 tasm,所以我只能在调试器中看到变量)结果应该是3EAAAA3A
但我得到了40400000
......那是3
!!!这怎么可能??我尝试交换变量,但什么也没有!!!你能帮助我吗??=(
assembly - FSTENV? 几乎找不到有关此指令的任何信息
我在一个程序中有这个指令:
它有什么作用?
它使用和更新哪些寄存器?
谢谢!
c++ - 在 C++ 中重置 8087CW 导致 .NET 应用程序出现异常
我正在使用 C# 中的 .NET 3.5 应用程序,它定期调用一些遗留 C++ 代码。我注意到,当我将鼠标悬停在具有下拉列表的 Infragistics UltraGrid 上时,调用 C++ 有时会导致“上溢或下溢算术运算”。我发现这只发生在 C++ 代码执行以下操作时:
如果我注释掉最后一行,我的 .NET 应用程序中将不再出现错误。我没有注意到应用程序的其余部分有任何其他副作用。作为快速修复,我想将此行注释掉。禁用 FPU 异常而不重置控制字的后果是什么?
c++ - 这是 sqrt 函数中的错误吗
sqrt
我创建了一个应用程序来计算 64 位范围内的素数,所以当我尝试使用来自的函数计算 64 位数的平方根时,math.h
我发现答案不准确,例如当输入是~0ull
答案应该是~0u
但我得到的0x100000000
一个是不正确的,所以我决定使用汇编 x86 语言创建我自己的版本,看看这是否是一个错误,这是我的功能:
输入是奇数以获得其平方根。当我用相同的输入测试我的函数时,结果是一样的。
我不明白为什么这些函数会围绕结果,或者具体为什么sqrt
指令会围绕结果?
assembly - GCC 在转换 unsigned int 时如何使用 fildll?
英特尔指令集参考声明(强调我的):
将有符号整数源操作数转换为双扩展精度浮点格式并将值压入 FPU 寄存器堆栈。源操作数可以是字、双字或四字整数。它加载时没有舍入错误。源操作数的符号被保留。该指令在非 64 位模式和 64 位模式下的操作相同。
在这里你可以看到我的测试用例:
c - 在汇编中添加浮点数/双精度数
我正在尝试使用内联汇编,并尝试在内联汇编中添加十进制数(不,不是整数)。问题是,当我调用以下函数时:
编译器抱怨内联汇编中的操作数大小不正确(所有汇编行,不包括 push 和 pop 指令行)。所以只好改成整数类型,比如unsigned long,然后就可以了,不过当然只支持整数类型;十进制结果四舍五入。
有没有办法添加允许像 8.4 这样的十进制结果的程序集?
c++ - 浮点指令异常——FLDZ 故障?
我正在尝试调试我之前在这里发布的问题:
C++ 和 pin 工具 - IF 语句非常奇怪的 DOUBLE 变量问题。我使用 gdb 追踪了发生奇怪行为的时刻。我发现如下图所示,它显示了显示反汇编代码和浮点寄存器值的 gdb 屏幕截图。(此处为大图)
左侧图像显示了突出显示的FLDZ
指令执行前的屏幕截图,右侧图像显示了指令执行后的屏幕截图。我查了 x86 ISA 并FLDZ
用于加载+0.0
到ST(0)
. 但是,我得到的是-nan
而不是+0.0
. 有人知道为什么会这样吗?我使用的系统是运行 64 位 CentOS 的 Intel xeon 5645,但我尝试调试的目标程序是 32 位应用程序。另外,正如我在前一篇文章中提到的,我尝试了两个版本的 gcc,4.2.4 和 4.1.2,并发现了同样的问题。谢谢。
--add-- 顺便说一下,下面是源代码。
assembly - 如何将 ST(0) 移动到 EAX?
你好,我正在学习 x86 FPU 组装,我有一个简单的问题,我找不到答案:
如何将值从ST(0)
(FPU 堆栈的顶部)移动到EAX
?
另外:
此代码是否正确:
c++ - Visual C++ 2012 中的正弦计算不一致?
考虑以下代码:
使用 Visual C++ 2012 ( cl fputest.cpp
) 编译并执行程序时,输出如下:
问题:
- 为什么这两个值不同?
- 是否可以发布一些编译器选项,以便计算的正弦值完全相同?