问题标签 [fpu]
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.
.net - 如何设置和恢复 FPU CTRL 寄存器?
我可以用这个重置 FPU 的 CTRL 寄存器:
http://support.microsoft.com/kb/326219
但是我怎样才能保存当前的寄存器,然后再恢复它们呢?
它来自.net代码..
我正在做的是从 Delphi 调用 .net dll 作为 COM 模块。检查Ctrldelphi 中的寄存器会产生一个值,使用 .net 代码中的 controlfp 检查会产生另一个值。我需要的,本质上是这样做:
所以我在.net代码中的浮点计算不会崩溃,但我想Ctrl在返回时恢复寄存器。
也许我没有?也许德尔福在需要时重置它们?我在这里写了关于这个问题的博客。
c - 简单浮点运算的奇怪结果 - 糟糕的 FPU 内部状态?
我有一个软件项目,有时我会从小的、简单的浮点运算中得到奇怪的结果。我假设我错过了一些东西,并且想要一些关于如何调试以下问题的提示:
(使用的编译器是 MS VC 6.0,即 Microsoft C 编译器的 12 版)
第一个异常:
由于某种原因,计时器评估失败并且计时代码从未执行。在调试器中,可以看到触发条件实际上是正确的,但 FPU 拒绝找到肯定的结果。以下代码段没有问题,尽管它执行相同的操作。通过插入可能允许失败的虚假评估来回避这个问题。
我猜 FPU 状态在某种程度上被早期执行的操作所污染,并且有一些编译器标志会有所帮助?
第二个异常:
结果是#IND,即使调试器将等式计算为大约 0.05。当使用 fld 指令将 2.0F 值加载到 FPU 时,#IND 值出现在 FPU 堆栈中。上一条指令使用 fild 指令将整数值 2000 作为双浮点数加载。一旦 FPU 堆栈包含 #IND 值,所有内容都将丢失,但调试器再次评估公式没有问题。稍后,这些操作会返回预期的结果。
此外,FPU 问题再次发生在函数调用之后。我应该在每个新函数之后插入清除 FPU 状态的浮点操作吗?是否存在可能以某种方式影响 FPU 的编译器标志?
在这一点上,我很感激所有的提示和技巧。
编辑:我设法通过在顶部函数中首先调用汇编函数 EMMS 来避免这个问题。这样,FPU 就可以清除在调用我的代码的环境中创建或未创建的任何 MMX 相关垃圾。FPU 的状态似乎不是理所当然的。
//坦率
c - 处理windows上的fpu异常
我想在 Windows 上处理 fpu 异常,例如:
但是在窗户上。我尝试阅读 MSDN,但文件根本不清楚。我想在 x86 和 amd64 架构上使用 Visual Studio 编译器来做到这一点。
我对在 C++ 中翻译异常不感兴趣——实际上,我什至对 FPU 异常都不感兴趣,只对经过一些计算后知道 FPU 状态感兴趣,就像上面的例子一样。
== 编辑 ==
好的,看起来它实际上要简单得多:使用 _clearfp 就足够了:
比处理异常、SEH 和其他不可移植的东西要好得多:)
c - 截断时的浮点舍入
这可能是 x86 FPU 专家的问题:
我正在尝试编写一个在 [min,max] 范围内生成随机浮点值的函数。问题是我的生成器算法(浮点 Mersenne Twister,如果你好奇的话)只返回 [1,2) 范围内的值 - 即,我想要一个包容性的上限,但我的“源”生成值是从一个排他的上限。这里的问题是底层生成器返回一个 8 字节的双精度,但我只想要一个 4 字节的浮点数,而且我使用的是默认的 FPU 舍入模式 Nearest。
我想知道的是,在这种情况下,截断本身是否会导致我的返回值在 FPU 内部 80 位值足够接近时包含最大值,或者我是否应该在将最大值乘以之前增加最大值的有效位[1,2) 中的中间随机数,或者我是否应该更改 FPU 模式。当然,或者任何其他想法。
这是我目前使用的代码,我确实验证了 1.0f 解析为 0x3f800000:
如果它有所作为,这需要在 Win32 MSVC++ 和 Linux gcc 上工作。另外,使用任何版本的 SSE 优化会改变这个问题的答案吗?
编辑:答案是肯定的,在这种情况下,从 double 到 float 的截断足以导致结果包含 max。有关更多信息,请参阅 Crashworks 的答案。
assembly - 在汇编器中实现 math.h 函数
我已经使用 gdb 单步执行了在标准 C 数学库 (-lm -march=pentium3 -mfpmath=387) 中实现标准 C sin() 函数的汇编代码。那里有很多存根,我不知道为什么他们没有简单地内联 fsin 汇编程序指令。其他数学函数也是如此。为什么他们不只是调用相应的 FPU 指令?
x86 - x87 相对于 SSE 的优势
我知道 x87 具有更高的内部精度,这可能是人们看到的它与 SSE 操作之间的最大区别。但我不得不怀疑,使用 x87 还有其他好处吗?我有-mfpmath=sse
在任何项目中自动输入的习惯,我想知道我是否遗漏了 x87 FPU 提供的任何其他内容。
.net - 使用 .net 在 fpu 硬件中实现了哪些数学方法?
有谁知道.net处理器的硬件实现了哪些数学方法?例如,我有一个算法大量使用了 atan。我可以很容易地为此编写一个查找表,但如果 math.net 使用 fpu 或其他硬件扩展来实现它,那将不值得。
multithreading - FPU 控制字是按线程还是按进程设置的?
我需要在多线程应用程序中更改FPU 控制字的默认设置。这是每个线程还是每个进程的设置?它在 Mac OS X 和 Windows 下有不同的作用域吗?
visual-c++ - 什么决定了 x87 FPU 控制字的默认设置?
什么决定了 x87 FPU 控制字的默认设置——特别是精度控制字段?编译器是否根据目标处理器设置它?是否有编译器选项可以更改它?
在 Intel Core Duo 处理器上使用 Microsoft Visual C++ 2008 Express Edition,精度控制字段的默认设置为“01b”,表示双精度(53 位)。我想知道 - 为什么默认值不是“11”b,或扩展(64 位)精度?
(我知道我可以使用 _controlfp 更改它。)
assembly - 为什么 FLD1 改为加载 NaN?
我有一个单行 C 函数,它只是return value * pow(1.+rate, -delay);
- 它将未来值折扣为现值。拆解的有趣部分是
在单步执行此函数时,gdb 说(速率为 0.02,延迟为 2;您可以在堆栈上看到它们):
之后fld1
:
在这之后,一切都下地狱了。事情被严重高估或低估了,所以即使我的 freeciv AI 尝试中没有其他错误,它也会选择所有错误的策略。就像派全军去北极一样。(叹气,要是我能走那么远就好了。)
我一定是遗漏了一些明显的东西,或者被某些东西蒙蔽了双眼,因为我无法相信这fld1
会失败。更不用说它只在少数通过此功能后才会失败。在较早的传递中,FPU 正确地将 1 加载到 ST(0) 中。0x080555c6 处的字节肯定会编码fld1
- 在正在运行的进程中使用 x/... 检查。
是什么赋予了?