cpp: 如何在 -Ofast 中计算 epsMachine

cpp: how to compute epsMachine in -Ofast

提问人: 提问时间:9/15/2023 更新时间:9/15/2023 访问量:50

问:

在存在任意编译器优化标志的情况下,如何计算给定类型名的机器舍入单位的正确值?如果不可能,让我们将可能的编译器标志集限制为 由 设置的所有优化标志。-Ofast

背景

以下代码

template<typename Tfloat>
Tfloat get_eps_mach(){
    Tfloat x=1, q=0.5, u=q;
    while( x!=(x+q*u) ){ u*=q; }
    return u;
}

当使用编译器选项时,将为机器舍入单元返回小得离谱的数字。我理解为什么(这是由于 ,它授予编译器操作比较和增量的权限),但我寻求一种方法,以便我可以正确计算任意数字。注意:此处的术语 correct 的含义没有个人色彩,因为该值是根据数字类型的位表示形式(特别是尾数长度)正式明确定义的。u-Ofast-ffast-mathuu

虽然在我的编程模型中,该位表示应该是黑盒且无法实现的,我什至不想假设数字类型使用尾数或其他什么,但我仍然坚持持有一个不可知函数,该函数将返回正确的值 。(因此,建议对每种常见数字类型重载函数也是一个毫无意义的“解决方案”。我感兴趣的原因是:u

  1. 后续参数(例如,最佳截断、最佳扰动、合理容差等)将计算为 的公式。u
  2. 我不想担心在未来的任何时候都需要任何未来或用户定义的数字类型,因此无论使用什么编译器选项,该函数都可能无法返回正确的值。get_eps_mach
C++ 舍入 IEEE-754 编译器标志

评论

0赞 KIIV 9/15/2023
numeric_limits epsilon 不能与 -Ofast 一起使用吗?
0赞 9/15/2023
谢谢@KIV。它是否像 constexpr 静态函数命名空间,以便它为相应的类型名计算 epsMach?因为我认为这是每个当前已知数字类型的查找表,在这种情况下,它涉及未来数字类型可能产生错误结果的风险。
0赞 KIIV 9/15/2023
这些值是众所周知的 - 指定得很好,因此在运行时计算它没有意义。您可以尝试打印浮点数和双精度的值,并将其与您的模板进行比较,以及它如何随着不同的编译选项而变化。
0赞 9/15/2023
@KIV:你所指的内容可以通过元编程来修复。这与以下思维游戏无关:假设我给你一个目标文件和一个数字类型为 FPfancy 的标头。现在你要告诉我你对FPfancy的正确价值是什么。这就是所提出的问题。现在我假设你不能,因此你不能回答所说的问题。因此,你是无济于事的。如果我被误导了,请纠正。
0赞 KIIV 9/15/2023
当您不确定时,请进行测试。打印实际值或其他值(您可以将其打印为十六进制以避免舍入错误)。顺便说一句:这不应该是答案,如果不能用它来代替,这是一个问题。

答: 暂无答案