将单精度浮点数转换为双精度进行除法

Nos*_*All 1 c floating-point fortran hpc

作为一个高性能计算人员,我们倾向于尽可能默认为单精度浮点数(floatreal).这是因为如果每个操作单独执行得更快,则每秒可以执行更多操作.

然而,与我合作的资深人士之一总是坚持(当需要准确性时),您应该暂时将单精度数据转换为双精度数据以执行除法.那是:

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 doublea/b必须首先将计算舍入到double,然后再舍入到float.在这种情况下,它可能不如直接舍入long doublefloat(后者产生正确的舍入结果,而前者在极少数情况下可能无法这样做,除非像Figueroa的其他定理适用并表明这种情况从未发生).

长话短说,对于任何现代的,合理的浮点计算平台(*)来说,迷信float ans = ((double)a)/((double)b);都有任何好处.你应该问你在问题中提到的老年人展示一对a, b结果不同的价值观,更不用说更准确了.当然,如果他们坚持认为这样做会更好,那么他们提供一对价值就不会有任何问题.

(*)记得-fexcess-precision=standard与GCC一起使用以保持你的理智

  • 得到它,其他人在直接打印双重结果或使用比问题更多的操作时出错.然而,我们对转换为单个的最终结果感兴趣.+1 (2认同)