|   |      1 
                                  3
                             首先要做的是分解: 我们不仅避免了一些溢出,而且获得了准确性。 
   如果任何因素接近
    
   这种情况不太可能发生,所以
    
 
   请注意,如果
    | 
|   |      2 
                                  2
                             
   这个答案假设一个平台使用符合IEEE-754(2008)的浮点算法,并提供融合乘加(FMA)功能。x86-64、ARM64和Power等常见体系结构都满足这两个条件。FMA在ISO C99和更高版本的C标准中作为标准数学函数公开
    
   从数学上讲,给定斜边和另一条腿的长度,直角三角形中一条腿(cathetus)的长度可以简单地计算为
    第一个问题可以通过按2的比例轻松解决 n 这样,量值较大的一词就更接近于统一。由于可能涉及次正常数,这无法通过操纵指数字段来实现,因为可能需要规范化/非规范化。但我们可以通过指数字段位操作,即乘以因子来计算所需的比例因子。我们知道,对于非特殊情况,斜边必须更长或与给定腿的长度相同,因此可以根据该参数进行缩放。 
   处理减法对消比较困难,但幸运的是,在其他重要问题中,计算与我们的计算h-a非常相似。例如,浮点计算大师研究了二次公式判别式的精确计算,
    William Kahan,“关于无超精密算法的浮点计算成本”,2004年11月21日( online ) 
   最近,法国研究人员研究了两种产品差异的更一般情况,
    Claude Pierre Jeannerod、Nicolas Louvet、Jean-Michel Muller,“进一步分析Kahan算法,以精确计算2 x 2行列式。” 计算数学 ,第82卷,第2842013年10月,第2245-2264页( online ) 第二篇文章中基于FMA的算法计算两个乘积的差值,经证明最大误差为1.5 ulp 。有了这个构建块,我们就可以得到下面cathetus计算的简单ISO C99实现。通过与任意精度库的结果进行比较,在10亿个随机试验中观察到最大误差为1.2 ulp:  | 
|   |      3 
                                  1
                             假设IEEE 754基本64位二进制浮点,我会考虑如下算法: 
 关于推理的注释: 
 | 
|   |      4 
                                  0
                             
    放在一边,我倾向于只写 
   作为函数的主体,并让调用者检查输入。如果无法做到这一点,请遵循
    | 
|   | feasega · 聚合物模拟-2个节点之间的最短路线,适用于所有节点 9 月前 | 
|   | Alisa Petrova · 在有向图中更改一对顶点以创建循环 10 月前 | 
|   | Pengcheng · 这个简单的递归函数的输出是什么?你能详细解释一下吗? 10 月前 | 
|   | b39b332d · 使用C++标准库实现高效间隔存储 1 年前 | 
|   | ABGR · 二叉树的直径——当最长路径不通过根时的失败案例 1 年前 | 
|   | EpicAshman · 数独棋盘程序中同一列和同一行出现两次的数字 1 年前 |