- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有一个 C 程序,其中包含 math.h
并使用该 header 中的 sqrt
函数。非常奇怪,当我不传递 -Ofast
标志时,我的代码无法编译。
如果我使用以下代码编译我的代码:
gcc -std=c99 foo.c
单独使用,或将 -O1
、-O2
或 -Os
(这些都是大写的 O)添加到该命令中,我收到以下错误:
/tmp/ccAcT2Bz.o: In function `sum_of_divisors':
foo.c:(.text+0xb): undefined reference to `sqrt'
collect2: error: ld returned 1 exit status
-O3
给出了一个类似但更详细的错误(请注意,我没有在 main
中调用 sqrt
):
/tmp/ccBKvvFS.o: In function `sum_of_divisors':
foo.c:(.text+0x5c): undefined reference to `sqrt'
/tmp/ccBKvvFS.o: In function `main':
foo.c:(.text.startup+0xe5): undefined reference to `sqrt'
foo.c:(.text.startup+0xf3): undefined reference to `sqrt'
collect2: error: ld returned 1 exit status
但是,-Ofast
编译没有错误,程序运行完美。所以,
-Ofast
,我该如何修复它?最佳答案
我会尝试根据我提供的评论将其表述为答案。
本质上,-ffast-math
允许不符合 IEEE-754 标准的数学“优化”。一些示例包括允许浮点运算遵守结合律,例如,它们表现得像“实数”:(a + b) + c == a + (b + c)
- 和这不是 float 的正确假设。您可以查看 gcc
的手册页以了解 -ffast-math
启用的选项。
该选项还允许使用与 IEEE-754 标准不同的其他代码生成选项。应该引发异常、发出 NaN 信号等的操作可能不会被接受。评论中的例子是sqrt
;如果我们将负值传递给 sqrt
,结果可能不符合 IEEE-754 标准。试图找到这些不一致的根源远远超过现代处理器的任何好处。现代 CPU 拥有海量浮点资源,正确性远比任何错位的效率感重要。
有很多真实的例子说明在处理 float 时遵守实数的关联属性会导致不正确的结果。一个例子是 Kahan summation .它依赖于浮点运算的非关联属性。还有其他示例,其中数值算法的仔 segmentation 析依赖于 IEEE-754 属性。另一个例子是 Heron's formula对于三角形的面积。
数值分析是一个广阔的领域,IEEE-754 标准代表了一项非常仔细和深入研究的工作,旨在标准化浮点运算的特殊行为,以及它们与“实”数的朴素理想的偏差。它代表了在数值密集型计算方面数十年的研究和经验(更不用说挫折)的巨大努力。
有些人经常在这个网站上回答 float 问题,他们对该主题的了解比我广泛得多。我只是希望让你相信 -ffast-math
在很多情况下都是不明智的(通常具有更好数值条件的算法是更好的第一步),并引入极其困难的错误源寻找,其结果通常无法在其他平台上重现。像躲避瘟疫一样躲避它。
关于c - -Ofast 以外的任何内容都会导致 "undefined reference"错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25439794/
我正在优化一个简单的遗传算法和神经网络,我正在 GCC 中摆弄一些选项以生成更快的可执行文件。 在我的代码中,我有一些断言,例如 mat mat_add(mat a, mat b) { ass
我在我的程序中使用 -Ofast gcc 选项导致延迟要求。我写了一个简单的测试程序: #include #include static double quiet_NaN = std::numer
我有一个关于最新 GCC 编译器(版本 >= 5)的问题,代码如下: #include void test_nan ( const float * const __restrict__ in
考虑以下测试程序: # include # include using namespace std; int main() { double y = 50.2944, yc = 63.2128
我在 Swift 中使用 Dictionary 实现本质上是缓存。性能远低于我的预期。我读过其他一些问题,例如 this one about array sorting这似乎表明 -Ofast 是答案
在 g++ 4.6(或更高版本)中,除了 -ffast-math 之外,-Ofast 还启用了哪些额外优化? 手册页说此选项“还启用了并非对所有符合标准的程序都有效的优化”。我在哪里可以找到有关这是否
重新编译旧程序使其输出错误结果。 我想知道为什么 . 我知道-Ofast可能“无视严格的标准合规性”,但我很好奇引擎盖下会发生什么。 我将程序简化为这个 最小示例 foo1.c : #include
我只是在阅读 gcc 手册以找出 -O3 之间的区别和 -Ofast . 对于 -O3 -O3 Optimize yet more. -O3 turns on all optimizations sp
在 xcode 5 中,优化级别引入了一个名为 -Ofast 的新级别。 (最快,积极的优化)。我应该何时以及如何使用此级别? 最佳答案 在 GCC 中,-Ofast 表示允许编译器忽略浮点数的有限精
#include int main(void) { int val = 500; printf("%d\n", (int)((long double)val / 500));
我在 http://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html#Optimize-Options 上的 gcc 文档中找到了 Ofast leve
我在 for 循环中实现了 OpenMP 并行化,其中我有一个 sum,这是导致我的代码变慢的主要原因。当我这样做时,我发现最终结果与我为非并行化代码(用 C 编写)获得的结果不同。所以首先,人们可能
我有一个 C 程序,其中包含 math.h 并使用该 header 中的 sqrt 函数。非常奇怪,当我不传递 -Ofast 标志时,我的代码无法编译。 如果我使用以下代码编译我的代码: gcc -s
我使用 gcc -pg 和 gprof 看到了奇怪的分析结果。 我找不到更好/更小的重现方法,因此我链接了我看到问题的实际代码。 我正在使用代码here ,使用 make prof 构建 gprof
这个问题在这里已经有了答案: Does rustc / cargo have a -march=native equivalent? (1 个回答) 关闭 2 年前。 Rust 是否具有 GCC 的
我正在将索引的地址输入到扩展的内联汇编操作中的表中,但是 GCC 在不需要时生成额外的 lea 指令,即使在使用 -Ofast 时也是如此-fomit-frame-pointer 或 -Os -f..
当使用 -O3 编译下面的基准代码时,它在延迟方面的差异给我留下了深刻的印象,所以我开始怀疑编译器是否通过某种方式删除代码来“作弊”。有办法检查吗?我可以安全地使用 -O3 进行基准测试吗?期望速度提
问题 我们有一个用于模拟任务的中型程序,我们需要对其进行优化。我们已经尽最大努力将源代码优化到我们编程技能的极限,包括使用 Gprof 和 Valgrind 进行分析。 最终完成后,我们希望在多个系统
类似于的SO问题What does gcc's ffast-math actually do? 并且与 Clang optimization levels 的 SO 问题相关,我想知道什么 clang
摘要 根据我的测试,使用 -O0 时 NSArray 的平均访问时间最快。我的测试代码访问长度为 0 到 10000 的所有数组的每个元素。 循环每个数组: start = mach_absolute
我是一名优秀的程序员,十分优秀!