|
11
|
| Boinst · 技术社区 · 16 年前 |
|
|
1
10
根据我的经验,大多数/fp:fast的影响(以及潜在的差异)来自于编译器自由地执行代数变换。这可以简单地更改summands顺序:
可以像a*(b+c)那样随意分配乘法,也可以得到一些相当复杂的变换,所有这些都是为了重用以前的计算。 在无限精度下,这种变换当然是良性的,但在有限精度下,它们实际上改变了结果。作为一个玩具示例,请尝试a=b=2^(-23),c=1的summand order示例。Eric Fleegal女士 describes it in much more detail . 在这方面,最接近/fp:precise的gcc开关没有不安全的数学优化。我认为它是默认开启的-也许你可以尝试显式设置它,看看它是否有区别。类似地,您可以尝试显式关闭所有-ffast数学优化:-fno finite math only、-fmath errno、-ftrapping math、-fronging math和-fsignaling nans(最后两个选项是 默认值!) |
|
2
18
为了扩展一个位,这些差异大多来自于使用x86 80位浮点寄存器进行计算(与用于存储的64位相比)
这些标志(在GCC和MSVC中)通常强制将每个中间结果截断为64位,从而使计算对代码生成和优化以及平台差异的变幻莫测不敏感。这种一致性除了在准确性/精确度方面的成本外,通常还伴随着轻微的运行时成本。 |
|
|
3
5
我认为没有确切的对等物。你可以试试
|
|
|
4
1
调试构建应该始终将每个中间结果存储在内存中,从而保证与/fp:precise对MSVC的结果相同。 这可能意味着(a)某个编译器中存在编译器错误,或者(b)更可能存在数学库错误。我将深入研究你计算中的各个函数,缩小差异所在。在那一点上,你可能会找到一个解决方法,如果你真的发现了一个bug,我相信相关的团队会很乐意听到的。 |
|
|
5
0
但是您可能需要用这个开关重新编译C和数学库来查看它们之间的区别。。。这可能也适用于其他建议的选项。 |
|
Willy · LINQ:将分组列表转换为新列表 8 年前 |
|
|
Kapil · 如何使用参数设置脚本任务SSI的路径 9 年前 |
|
|
c00000fd · 跨命名空间和不同的.H文件的友元类 9 年前 |
|
|
tangoal · 调用模板类成员时非法使用此类型作为表达式 9 年前 |