Nos*_*All 1 c floating-point fortran hpc
作为一个高性能计算人员,我们倾向于尽可能默认为单精度浮点数(float或real).这是因为如果每个操作单独执行得更快,则每秒可以执行更多操作.
然而,与我合作的资深人士之一总是坚持(当需要准确性时),您应该暂时将单精度数据转换为双精度数据以执行除法.那是:
float a, b;
float ans = ((double)a)/((double)b);
Run Code Online (Sandbox Code Playgroud)
要么
real :: a, b, ans
ans = real(dble(a)/dble(b))
Run Code Online (Sandbox Code Playgroud)
取决于你正在使用的语言.在我看来,这看起来很丑陋,说实话我甚至不知道答案是否ans会比你用ans = a/b单点精度书写的更准确.
有人可以告诉我,在算术之前转换你的数字,特别是执行除法,实际上会得到更准确的答案吗?这是一个语言/编译器特定的问题,还是由IEEE决定?使用什么数值可以最明显地提高精度?
任何有启发性的评论/答案将不胜感激.
Pas*_*uoq 10
float ans =((double)a)/((double)b);
此文章表明,ans始终是相同的如将被一个单精度除法为IEEE 754算术和FLT_EVAL_METHOD = 0来计算.
当FLT_EVAL_METHOD = 1时,同样的属性也很简单.
当FLT_EVAL_METHOD = 2时,我不确定.有可能人们可能会将规则解释long double为a/b必须首先将计算舍入到double,然后再舍入到float.在这种情况下,它可能不如直接舍入long double到float(后者产生正确的舍入结果,而前者在极少数情况下可能无法这样做,除非像Figueroa的其他定理适用并表明这种情况从未发生).
长话短说,对于任何现代的,合理的浮点计算平台(*)来说,迷信float ans = ((double)a)/((double)b);都有任何好处.你应该问你在问题中提到的老年人展示一对a, b结果不同的价值观,更不用说更准确了.当然,如果他们坚持认为这样做会更好,那么他们提供一对价值就不会有任何问题.
(*)记得-fexcess-precision=standard与GCC一起使用以保持你的理智