- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想知道使用浮点运算的 C 或 C++ 中的任何代码是否会在任何基于 x86 的体系结构中产生精确的结果,而不管代码的复杂性。
据我所知,自 Intel 8087 以来的任何 x86 架构都使用准备处理 IEEE-754 浮点数的 FPU 单元,而且我看不出任何原因为什么不同架构的结果会有所不同。但是,如果它们不同(即由于不同的编译器或不同的优化级别),是否有某种方法可以通过配置编译器来产生精确的结果?
最佳答案
目录:
double
是
IEEE-754 binary64 format 等,即使 x86 上的 C 实现使用其他格式的
double
和实现是合法的FP 数学与软件仿真,并在
float.h
中定义限制。当并非所有 x86 CPU 都包含在 FPU 中时,这可能是合理的,但在 2016 年,这是
Deathstation 9000 领域。)
Is IEEE floating-point math deterministic? Will you always get the same results from the same inputs? The answer is an unequivocal “yes”. Unfortunately the answer is also an unequivocal “no”. I’m afraid you will need to clarify your question.
pow()
、
log()
和
sin()
等其他数学库函数允许实现者在速度和准确性之间进行权衡。例如,glibc 通常偏向于准确性,并且在某些函数 IIRC 上比 Apple 的 OS X 数学库慢。另见
glibc's documentation of the error bounds for every libm function across different architectures 。
FLT_EVAL_METHOD
以便代码可以检测它是如何工作的,但是如果您不喜欢该实现的功能,您就没有选择。您确实可以选择(使用
#pragma STDC FP_CONTRACT off
)来禁止编译器例如将
a*b + c
转换为 FMA,在添加之前没有对
a*b
临时四舍五入。
FLT_EVAL_METHOD = 2
行为。 (标准规定在每次赋值时仍然会进行舍入,但是像 gcc 这样的真正编译器实际上不会为舍入进行额外的存储/重新加载,除非您使用
-ffloat-store
。参见
https://gcc.gnu.org/wiki/FloatingPointMath 。标准的那部分似乎是在假设非优化的情况下编写的编译器或硬件有效地提供舍入到类型宽度,如非 x86,或像 x87 精度设置为舍入到 64 位
double
而不是 80 位
long double
。在每个语句
is exactly what gcc -O0
and most other compilers do 之后存储,并且标准允许额外的精度一个表达式的评估。)
float
指令计算三个
FADD
的总和,而无需将前两个的总和四舍五入为 32 位
float
。在这种情况下,临时文件具有 80 位精度......或者是吗?并非总是如此,因为 C 实现的启动代码(或 Direct3D 库!!!)可能已更改 x87 控制字中的精度设置,因此 x87 寄存器中的值四舍五入为 53 或 24 位尾数。 (这使得 FDIV 和 FSQRT 运行得更快一些。)所有这些都来自
Bruce Dawson's article about intermediate FP precision) 。
fldpi
获得的 80 位 pi 常数(正确舍入的 64 位尾数,实际上是 66 位,因为确切值的下 2 位为零)。英特尔关于最坏情况错误的文档相差 1.3 quintillion
until they updated it after Bruce Dawson noticed how bad the worst-case actually was 。但这只能通过降低扩展精度范围来解决,因此在硬件上不会便宜。
rsqrt
(快速近似倒数平方根)
is not exactly specified ,我认为即使在牛顿迭代之后你也有可能得到不同的结果,但
除了 SSE/SSE2 在asm 中总是有点精确,假设不是 MX设置奇怪。所以唯一的问题是让编译器生成相同的代码,或者只是使用相同的二进制文件。
libm
并分发这些二进制文件,它们将在任何地方运行。除非该库使用运行时 CPU 检测来选择替代实现...
关于c - 是否有任何浮点密集型代码在任何基于 x86 的架构中产生位精确的结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27149894/
感觉我在这里遗漏了一些明显的东西,所以提前道歉。无论如何,这是我尝试转换的一些数据a: acct_num year_prem prem exc 001 20
我正在尝试将表中的模式与用户话语 匹配。 string userUtterance = "I want identification number for number of customers";
当尝试在 Precise 上链接 gccgo 时,出现此链接错误: matt@matt-1005P:~/src/gopath/src/meme$ gccgo cmd/meme/main.go -o m
假设我有以下数据和命令: clc;clear; t = [0:0.1:1]; t_new = [0:0.01:1]; y = [1,2,1,3,2,2,4,5,6,1,0]; p = interp1(
假设我有以下数据和命令: clc;clear; t = [0:0.1:1]; t_new = [0:0.01:1]; y = [1,2,1,3,2,2,4,5,6,1,0]; p = interp1(
我总是想给精确匹配比只匹配前缀的分数更高的分数(例如,“ball”在与“ball*”匹配时应该比“ballistic”得到更高的分数)。 我当前(详细)的方法是在创建 PrefixQuery 时始终执
有什么解决方法可以让我在 Android 中使用 long 或 double 来寻找音频文件中的位置吗?目前 seekTo 只接受 ints 参数。我想更精确(比如在十分之一秒内) int resID
我的 replacingOccurrences 函数有问题。我有一个这样的字符串: let x = "john, johnny, johnney" 我需要做的只是删除“john” 所以我有这段代码:
我正在使用 BeautifulSoup 进行网页抓取。我有这段代码来提取 a 标签的值,但它似乎不起作用。显示错误: AttributeError: 'int' object has no attri
我要在带有标记顶点和标记有向边的图上寻找一种不精确的图匹配算法。我的任务是检测两个图表的变化以将它们显示给开发人员(想想颠覆差异)。我已经实现了基于禁忌搜索 ( this ) 的优化算法,但我无法让该
我有两个网站: example.com 和 yyy.com 他们都有类似的网络应用程序,但在不同的服务器上。我想让 Apache 将所有路径请求重定向到 example.com 与 完全相同的方式yy
因此,我尝试合并两个公司信息数据库(从现在起表 A 和表 B),其中最常见(且可靠)的单一引用点是网站 URL。表 A 已更新,表 B 待更新。 我已经从表 A 中提取了 URL,并使用 PHP 清理
我正在 http://classicorthodoxbible.com/new.html 上制作效果主要描述中的 Angular 色,包裹在自己的跨度中,从他们通常的休息地点移动到随机位置,然后通过指
我目前正在使用我的 Raspberry Pi 及其内置 UART 输入编写 MIDI 合成器。 在某个时间点,为了启用 MIDI 输入的实时回放,我必须设置一种环形缓冲区以与 OpenAL 一起使用,
在 C 中,当设置了一个 float 时, int main(int argc, char *argv[]) { float temp = 98.6f; printf("%f\n",
实现 MP3 无间隙循环的最佳可能性是什么?目前我正在使用 AVAudioPlayer 并将 .numberOfLoops() 属性设置为 -1 但可以听到,轨道重新启动。情况并非如此,例如使用 Tr
我想创建不一定是“正确”矩阵的“类矩阵”对象。但是,确切地说,“类矩阵”是什么意思? 示例 1 > image(1:9) Error in image.default(1:9) : argument
给定一个像这样的 XML 文档: john &title; 我想解析上面的 XML 文档并生成其所有实体已解析的副本。因此,给定上述 XMl 文档,解析器应输出: john
需要说明的是,这种方法不是我要找的: 事实上,此方法会调整 ImageField 的大小。我想将 Image 对象的大小调整为特定且精确的无比例分辨率。有什么办法吗? --编辑-- 对我来说,Ima
我正在尝试使用 TF2.0 eager 模式执行精确的 GP 回归,基于来自 https://colab.research.google.com/github/tensorflow/probabili
我是一名优秀的程序员,十分优秀!