提问人: 提问时间:9/15/2023 更新时间:9/15/2023 访问量:50
cpp: 如何在 -Ofast 中计算 epsMachine
cpp: how to compute epsMachine in -Ofast
问:
在存在任意编译器优化标志的情况下,如何计算给定类型名的机器舍入单位的正确值?如果不可能,让我们将可能的编译器标志集限制为 由 设置的所有优化标志。-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-math
u
u
虽然在我的编程模型中,该位表示应该是黑盒且无法实现的,我什至不想假设数字类型使用尾数或其他什么,但我仍然坚持持有一个不可知函数,该函数将返回正确的值 。(因此,建议对每种常见数字类型重载函数也是一个毫无意义的“解决方案”。我感兴趣的原因是:u
- 后续参数(例如,最佳截断、最佳扰动、合理容差等)将计算为 的公式。
u
- 我不想担心在未来的任何时候都需要任何未来或用户定义的数字类型,因此无论使用什么编译器选项,该函数都可能无法返回正确的值。
get_eps_mach
答: 暂无答案
评论