- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
浮点区间的区间可用于过度逼近实数集,只要任何结果区间的上限是向上舍入计算的,下限是向下舍入的。
一个推荐的技巧是实际计算下界的否定。这允许 FPU 始终保持向上舍入(例如,“Handbook of Floating-Point Arithmetic”,2.9.2)。
这适用于加法和乘法。另一方面,平方根运算在加法和乘法方面并不对称。
我突然想到,为了计算下限的 sqrtRD,尽管它很复杂,但在具有 IEEE 754 double 和 FLT_EVAL_METHOD
定义为 0 比更改舍入模式两次:
#include <fenv.h>
#include <math.h>
#pragma STDC FENV_ACCESS ON
…
/* assumes round-upwards */
double sqrt_rd(double l) {
feclearexcept(FE_INEXACT);
double candidate = sqrt(l);
if (fetestexcept(FE_INEXACT))
return nextafter(candidate, 0);
return candidate;
}
我想知道这是否更好,是否是最快的。作为一种可能的替代方案,但不一定是最快的,在我看来 FMARU(candidate, candidate, -l) 可能并不总是准确的(因为有向舍入)但可能是在 0 附近足够准确,以便以下工作:
/* assumes round-upwards */
double sqrt_rd(double l) {
double candidate = sqrt(l);
if (fma(candidate, candidate, -l) != 0.0)
return nextafter(candidate, 0);
return candidate;
}
还有哪些其他廉价的方法可以检测到 sqrt
不准确?什么样的浮点运算组合可以在现代 FPU 设置为向上舍入时实现最快的 sqrt_rd
计算?
最佳答案
我认为你应该能够使用:
/* assumes round-upwards */
double sqrt_rd(double l) {
double u = sqrt(l);
double w = u*u;
if (w != l)
return nextafter(u, 0);
return u;
}
这里的理由是如果 u
不精确,那么它将严格大于 √l
,这反过来意味着 w
>= u
2> l
(因为 w
也是在 RU 模式下计算的)。如果 u
是精确的,那么 w
也是精确的(因为我们知道它必须可以表示为 double )。
关于在 RU 模式下使用 FPU 计算 RD(sqrt(x)),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36038858/
我在 masm 中有这段代码来处理 FPU,它工作得很好 在这段代码中,我从 2 个不同的文本框中获取一个数字,然后将它们相除,然后将结果输出到另一个文本框 这是本地的数据 LOCAL variabl
现代 FPU 使用什么方法来计算 transcendental functions ? 例如,Intel CPU 提供的指令如 FSIN , FCOS , FYL2X等。我很好奇将使用哪些算法在硬件中
我需要更改 FPU control word从它在多线程应用程序中的默认设置。这个设置是每线程还是每进程?它在 Mac OS X 和 Windows 下有不同的作用域吗? 最佳答案 它是 Window
fpu 以基于堆栈的方式实现其寄存器的动机是什么?据我了解,其他指令集(例如 x86/sse)使用命名寄存器。我可以想象基于堆栈的属性通常与我们对函数的想法相对应,从而为汇编程序员带来更直观的设计。
为什么当进入ECX循环时会有一些大的随机值插入0?还有其他方法可以在这里循环吗? program Project2; {$APPTYPE CONSOLE} uses SysUtils; funct
十进制数学是否使用 FPU? 我认为答案是肯定的,但我不确定,因为小数不是浮点数,而是固定精度数。 我主要在寻找 .NET,但一般的答案也很有用。 最佳答案 关于 .NET,更具体地说是 C#,不,S
我有一个函数是实用程序库的一部分,它在 C++ Builder 中编译和运行时创建的单元测试失败。问题函数如下。运行单元测试时,程序似乎卡在 fldcw controlWord 行,无法越过该行。似乎
我想在 x86 系统中禁用 FPU/MMX/SSE 指令,我将为 Device-Not-Available 异常实现一个处理程序。我提到了Control register wiki page ;看来我
我最近在 FPU 堆栈溢出方面遇到了一些麻烦。我设法将其追溯到一个有问题的库函数,该函数每次调用时都会将垃圾值推送到 FPU 堆栈上,并且从不清除它。 幸运的是,这很容易重现,我确切地知道是什么条件导
我目前正在开发一个同时使用 CPU 和 FPU 寄存器的汇编程序。我的问题涉及如何将寄存器值加载到 FPU 堆栈(即 ecx)。 mov ecx, 10d ; Load 10 into E
我目前正在开发一个同时使用 CPU 和 FPU 寄存器的汇编程序。我的问题涉及如何将寄存器值加载到 FPU 堆栈(即 ecx)。 mov ecx, 10d ; Load 10 into E
抱歉我的英语不好 我正在努力提高我的 asm 能力,我发现这很容易使用机器代码例程对其进行处理的入口点来自 C 代码 我是这样用的 char asmRoutineData2[] =
所以我在 AT&T 中用汇编写了一些 C。我现在遇到了一个小问题,因为当我用 float 参数调用 f_float 的第一个函数时,参数从堆栈加载并且返回值是正确的。但是在第二次调用带有双参数的 f_
我想知道,我应该使用什么值来更改 FPU 舍入模式。 .data nearest: ?? down: ?? up: ?? zero: ?? .text .global
介绍——又长又无聊的部分 (问题在最后) 我对不断更改 FPU 控制字的第三方 COM 组件感到非常头疼。 我的开发环境是Windows和Visual C++ 2008。正常的FPU控制字指定在各种情
我想知道是否可以将 SSE 与 x87 并行使用。所以考虑下面的伪代码, 1: sse_insn2: x87_insn 假设管道 1 和 2 可以并行执行,它们是否会并行执行? 最佳答案 在所有现代(
编辑:我在调试 session 期间犯了一个错误,导致我提出这个问题。我看到的差异实际上在于打印 double 和解析 double (strtod)。即使在这次整改之后,斯蒂芬的回答仍然很好地涵盖了
我有一个软件项目,在这个项目中,我有时会从小型、简单的浮点运算中得到奇怪的结果。我假设我遗漏了一些东西,并且想要一些关于如何调试以下问题的提示: (使用的编译器是MS VC 6.0,也就是Micros
是否可以在没有浮点单元的嵌入式处理器中执行浮点运算? 最佳答案 是的,您只需在软件中完成即可。你的compiler may provide support ,或者您可能需要自己动手。有freely-a
我可以用这个重置 FPU 的 CTRL 寄存器: http://support.microsoft.com/kb/326219 但是我怎样才能保存当前寄存器并在以后恢复它们呢? 它来自.net代码..
我是一名优秀的程序员,十分优秀!